java笔记

  笔记十

泛型
1、泛型集合 泛型本质上是提供类型的“类型参数”,也就是参数化类型。我们可以为类、接口或方法指定一个类型参数,通过这个参数限制操作的数据类型,从而保证类型转换的绝对安全。

2、泛型类 除了可以定义泛型集合之外,还可以直接限定泛型类的类型参数。语法格式如下:javapublic class class_name<data_type1,data_type2,…>{}其中,class_name 表示类的名称,data_ type1 等表示类型参数。Java 泛型支持声明一个以上的类型参数,只需要将类型用逗号隔开即可。 泛型类一般用于类中的属性类型不确定的情况下。在声明属性时,使用下面的语句:javaprivate data_type1 property_name1;private data_type2 property_name2;该语句中的 data_type1 与类声明中的 data_type1 表示的是同一种数据类型。例 2 在实例化泛型类时,需要指明泛型类中的类型参数,并赋予泛型类属性相应类型的值。例如,下面的示例代码创建了一个表示学生的泛型类,该类中包括 3 个属性,分别是姓名、年龄和性别。

3、泛型方法 到目前为止,我们所使用的泛型都是应用于整个类上。泛型同样可以在类中包含参数化的方法,而方法所在的类可以是泛型类,也可以不是泛型类。也就是说,是否拥有泛型方法,与其所在的类是不是泛型没有关系。 泛型方法使得该方法能够独立于类而产生变化。如果使用泛型方法可以取代类泛型化,那么就应该只使用泛型方法。另外,对一个 static 的方法而言,无法访问泛型类的类型参数。因此,如果 static 方法需要使用泛型能力,就必须使其成为泛型方法。

4、泛型的高级用法 泛型的用法非常灵活,除在集合、类和方法中使用外,本节将从三个方面介绍泛型的高级用法,包括限制泛型可用类型、使用类型通配符、继承泛型类和实现泛型接口。1. 限制泛型可用类型 在 Java 中默认可以使用任何类型来实例化一个泛型类对象。当然也可以对泛型类实例的类型进行限制,语法格式如下:javaclass 类名称<T extends anyClass>其中,anyClass 指某个接口或类。使用泛型限制后,泛型类的类型必须实现或继承 anyClass 这个接口或类。无论 anyClass 是接口还是类,在进行泛型限制时都必须使用 extends 关键字。
I/O流
在 Java 中所有数据都是使用流读写的。流是一组有序的数据序列,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。

1、什么是输入/输出流 Java 程序通过流来完成输入/输出,所有的输入/输出以流的形式处理。因此要了解 I/O 系统,首先要理解输入/输出流的概念。 输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,又可以作为输出设备。 数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。 1、按照流的方向主要分为输入流和输出流两大类。 2、数据流按照数据单位的不同分为字节流和字符流。 3、按照功能可以划分为节点流和处理流。 数据流的处理只能按照数据序列的顺序来进行,即前一个数据处理完之后才能处理后一个数据。数据流以输入流的形式被程序获取,再以输出流的形式将数据输出到其它设备。

2、输入流 Java 流相关的类都封装在 java.io 包中,而且每个数据流都是一个对象。所有输入流类都是 InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类。其中 InputStream 类是字节输入流的抽象类,是所有字节输入流的父类,

InputStream 类中所有方法遇到错误时都会引发 IOException 异常。如下是该类中包含的常用方法。| 名称 | 作用 || ---------------------------------- | ------------------------------------------------------------ || int read() | 从输入流读入一个 8 字节的数据,将它转换成一个 0~ 255 的整数,返回一个整数,如果遇到输入流的结尾返回 -1 || int read(byte[] b) | 从输入流读取若干字节的数据保存到参数 b 指定的字节数组中,返回的字节数表示读取的字节数,如果遇到输入流的结尾返回 -1 || int read(byte[] b,int off,int len) | 从输入流读取若干字节的数据保存到参数 b 指定的字节数组中,其中 off 是指在数组中开始保存数据位置的起始下标,len 是指读取字节的位数。返回的是实际读取的字节数,如果遇到输入流的结尾则返回 -1 || void close() | 关闭数据流,当完成对数据流的操作之后需要关闭数据流 || int available() | 返回可以从数据源读取的数据流的位数。 || skip(long n) | 从输入流跳过参数 n 指定的字节数目 || boolean markSupported() | 判断输入流是否可以重复读取,如果可以就返回 true || void mark(int readLimit) | 如果输入流可以被重复读取,从流的当前位置开始设置标记,readLimit 指定可以设置标记的字节数 || void reset() | 使输入流重新定位到刚才被标记的位置,这样可以重新读取标记过的数据 |

3、输出流 在 Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。其中 OutputStream 类是字节输出流的抽象类,是所有字节输出流的父类,

OutputStream 类是所有字节输出流的超类,用于以二进制的形式将数据写入目标设备,该类是抽象类,不能被实例化。OutputStream 类提供了一系列跟数据输出有关的方法,如下所示。| 名称 | 作用 || ------------------------------------ | -------------------------------------------------------- || int write(b) | 将指定字节的数据写入到输出流 || int write (byte[] b) | 将指定字节数组的内容写入输出流 || int write (byte[] b,int off,int len) | 将指定字节数组从 off 位置开始的 len 字节的内容写入输出流 || close() | 关闭数据流,当完成对数据流的操作之后需要关闭数据流 || flush() | 刷新输出流,强行将缓冲区的内容写入输出流 |# 二、系统流 每个 Java 程序运行时都带有一个系统流,系统流对应的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流,分别通过 in、out 和 err 变量来引用。这 3 个系统流如下所示: System.in:**标准输入流,默认设备是键盘。 **System.out:**标准输出流,默认设备是控制台。 **System.err:**标准错误流,默认设备是控制台。 以上变量的作用域为 public 和 static,因此在程序的任何部分都不需引用 System 对象就可以使用它们。

System.in 是 InputStream 类的一个对象,因此上述代码的 System.in.read() 方法实际是访问 InputStream 类定义的 read() 方法。该方法可以从键盘读取一个或多个字符。对于 System.out 输出流主要用于将指定内容输出到控制台。 System.out 和 System.error 是 PrintStream 类的对象。因为 PrintStream 是一个从 OutputStream 派生的输出流,所以它还执行低级别的 write() 方法。因此,除了 print() 和 println() 方法可以完成控制台输出以外,System.out 还可以调用 write() 方法实现控制台输出。 write() 方法的简单形式如下:javavoid write(int byteval) throws IOException该方法通过 byteval 参数向文件写入指定的字节。在实际操作中,print() 方法和 println() 方法比 write() 方法更常用。 **注意:**尽管它们通常用于对控制台进行读取和写入字符,但是这些都是字节流。因为预定义流是没有引入字符流的 Java 原始规范的一部分,所以它们不是字符流而是字节流,但是在 Java 中可以将它们打包到基于字符的流中使用。

四、File类(文件操作类)## 1、File类简介 在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成。File 类定义了一些方法来操作文件,如新建、删除、重命名文件和目录等。 File 类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。 File 类提供了如下三种形式构造方法。 **File(String path):**如果 path 是实际存在的路径,则该 File 对象表示的是目录;如果 path 是文件名,则该 File 对象表示的是文 件。 **File(String path, String name):**path 是路径名,name 是文件名。 **File(File dir, String name):**dir 是路径对象,name 是文件名。 使用任意一个构造方法都可以创建一个 File 对象,然后调用其提供的方法对文件进行操作。在下表中列出了 File 类的常用方法及说明。| 方法名称 | 说明 || ----------------------------- | ------------------------------------------------------------ || boolean canRead() | 测试应用程序是否能从指定的文件中进行读取 || boolean canWrite() | 测试应用程序是否能写当前文件 || boolean delete() | 删除当前对象指定的文件 || boolean exists() | 测试当前 File 是否存在 || String getAbsolutePath() | 返回由该对象表示的文件的绝对路径名 || String getName() | 返回表示当前对象的文件名或路径名(如果是路径,则返回最后一级子路径名) || String getParent() | 返回当前 File 对象所对应目录(最后一级子目录)的父目录名 || boolean isAbsolute() | 测试当前 File 对象表示的文件是否为一个绝对路径名。该方法消除了不同平台的差异,可以直接判断 file 对象是否为绝对路径。在 UNIX/Linux/BSD 等系统上,如果路径名开头是一条斜线/,则表明该 File 对象对应一个绝对路径;在 Windows 等系统上,如果路径开头是盘符,则说明它是一个绝对路径。 || boolean isDirectory() | 测试当前 File 对象表示的文件是否为一个路径 || boolean isFile() | 测试当前 File 对象表示的文件是否为一个“普通”文件 || long lastModified() | 返回当前 File 对象表示的文件最后修改的时间 || long length() | 返回当前 File 对象表示的文件长度 || String[] list() | 返回当前 File 对象指定的路径文件列表 || String[] list(FilenameFilter) | 返回当前 File 对象指定的目录中满足指定过滤器的文件列表 || boolean mkdir() | 创建一个目录,它的路径名由当前 File 对象指定 || boolean mkdirs() | 创建一个目录,它的路径名由当前 File 对象指定 || boolean renameTo(File) | 将当前 File 对象指定的文件更名为给定参数 File 指定的路径名 |File 类中有以下两个常用常量: **public static final String pathSeparator:**指的是分隔连续多个路径字符串的分隔符,Windows 下指;。例如 java -cp test.jar;abc.jar HelloWorld。 **public static final String separator:**用来分隔同一个路径字符串中的目录的,Windows 下指/。例如 C:/Program Files/Common Files。 **注意:**可以看到 File 类的常量定义的命名规则不符合标准命名规则,常量名没有全部大写,这是因为 Java 的发展经过了一段相当长的时间,而命名规范也是逐步形成的,File 类出现较早,所以当时并没有对命名规范有严格的要求,这些都属于 Java 的历史遗留问题。

3、创建和删除文件 File 类不仅可以获取已知文件的属性信息,还可以在指定路径创建文件,以及删除一个文件。创建文件需要调用 createNewFile() 方法,删除文件需要调用 delete() 方法。无论是创建还是删除文件通常都先调用 exists() 方法判断文件是否存在。

1、Windows 中使用反斜杠\表示目录的分隔符。 2、Linux 中使用正斜杠/表示目录的分隔符。 那么既然 Java 程序本身具有可移植性的特点,则在编写路径时最好可以根据程序所在的操作系统自动使用符合本地操作系统要求的分隔符,这样才能达到可移植性的目的。要实现这样的功能,则就需要使用 File 类中提供的两个常量。

*注意:**在操作文件时一定要使用 File.separator 表示分隔符。在程序的开发中,往往会使用 Windows 开发环境,因为在 Windows 操作系统中支持的开发工具较多,使用方便,而在程序发布时往往是直接在 Linux 或其它操作系统上部署,所以这时如果不使用 File.separator,则程序运行就有可能存在问题。关于这一点我们在以后的开发中一定要有所警惕。

4、创建和删除目录 File 类除了对文件的创建和删除外,还可以创建和删除目录。创建目录需要调用 mkdir() 方法,删除目录需要调用 delete() 方法。无论是创建还是删除目录都可以调用 exists() 方法判断目录是否存在。

5、遍历目录 通过遍历目录可以在指定的目录中查找文件,或者显示所有的文件列表。File 类的 list() 方法提供了遍历目录功能,该方法有如下两种重载形式。1. String[] list() 该方法表示返回由 File 对象表示目录中所有文件和子目录名称组成的字符串数组,如果调用的 File 对象不是目录,则返回 null。 **提示:**list() 方法返回的数组中仅包含文件名称,而不包含路径。但不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。2. String[] list(FilenameFilter filter) 该方法的作用与 list() 方法相同,不同的是返回数组中仅包含符合 filter 过滤器的文件和目录,如果 filter 为 null,则接受所有名称。

五、
RandomAccessFile类## 1、动态读取文件内容 所谓动态读取是指从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾。动态读取需要用到 Java 中的 RandomAccessFile 类。 RandomAccessFile 是 Java 输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。由于 RandomAccessFile 可以从任意位置访问文件,所以在只需要访问文件部分内容的情况下,使用 RandonAccessFile 类是一个很好的选择。 RandomAccessFile 对象包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个 RandomAccessFile 对象时,该对象的文件记录指针位于文件头(也就是 0 处),当读/写了 n 个字节后,文件记录指针将会向后移动 n 个字节。除此之外,RandonAccessFile 可以自由移动该记录指针,既可以向前移动,也可以向后移动。 RandomAccessFile 类中提供了一些常用读取和写入数据的方法,如表 1 所示。 | 方法名及返回值类型 | 说明 || ---------------------------- | --------------------------------------- || boolean readBoolean() | 从文件中读取一个 boolean 值 || byte readByte() | 从文件中读取一个带符号位的字节 || char readChar() | 从文件中读取一个字符 || int readlnt() | 从文件中读取一个带符号位的整数 || long readLong() | 从文件中读取一个带符号位的 long 值 || String readLine() | 从文件中读取下一行文本 || void seek(long pos) | 指定从文件起始位置开始的指针偏移量 || void writeBoolean(boolean v) | 以字节的形式向文件中写入一个 boolean 值 || void writeByte(int v) | 以单字节的形式向文件中写入一个 byte 值 || void writeChar(int v) | 以双字节的形式向文件中写入一个 char 值 || void writelnt(int v) | 以4字节的形式向文件中写入一个整数 || writeLong(long v) | 以8字节的形式向文件中写入一个 long 值 || void writeBytes(String s) | 以字节序列的形式向文件中写入一个字符串 || void skipBytes(int n) | 以当前文件指针位置为起始点,跳过 n 字节 |RandomAccessFile 类的构造方法有如下两种重载形式。 1、RandomAccessFile(File file, String mode):访问参数 file 指定的文件,访问形式由参数 mode 指定,mode 参数有两个常用的可选值 r 和 rw,其中 r 表示只读,rw 表示读写。 2、RandomAccessFile(String name, String mode):访问参数 name 指定的文件,mode 参数的含义同上。 **注意:**如果使用 rw 方式声明 RandomAccessFile 对象时,要写入的文件不存在,系统将自动进行创建。

六、字节流的使用 InputStream 是 Java 所有字节输入流类的父类,OutputStream 是 Java 所有字节输出流类的父类,它们都是一个抽象类,因此继承它们的子类要重新定义父类中的抽象方法。

1、字节输入流 InputStream 类及其子类的对象表示字节输入流,InputStream 类的常用子类如下。 **ByteArrayInputStream 类:**将字节数组转换为字节输入流,从中读取字节。 **FileInputStream 类:**从文件中读取数据。 **PipedInputStream 类:**连接到一个 PipedOutputStream(管道输出流)。 **SequenceInputStream 类:**将多个字节输入流串联成一个字节输入流。 **ObjectInputStream 类:**将对象反序列化。

**注意:**在使用 mark() 方法和 reset() 方法之前,需要判断该文件系统是否支持这两个方法,以避免对程序造成影响。

2、字节输出流 OutputStream 类及其子类的对象表示一个字节输出流。OutputStream 类的常用子类如下。 **ByteArrayOutputStream 类:**向内存缓冲区的字节数组中写数据。 **FileOutputStream 类:**向文件中写数据。 **PipedOutputStream 类:**连接到一个 PipedlntputStream(管道输入流)。 **ObjectOutputStream 类:**将对象序列化。

3、字节数组输入流ByteArrayInputStream 类可以从内存的字节数组中读取数据,该类有如下两种构造方法重载形式。
(1)ByteArrayInputStream(byte[] buf):创建一个字节数组输入流,字节数组类型的数据源由参数 buf 指定。
(2)ByteArrayInputStream(byte[] buf,int offse,int length):创建一个字节数组输入流,其中,参数 buf 指定字节数组类型的数据源,offset 指定在数组中开始读取数据的起始下标位置,length 指定读取的元素个数。

4、字节数组输出流 ByteArrayOutputStream 类可以向内存的字节数组中写入数据,该类的构造方法有如下两种重载形式。
1、ByteArrayOutputStream():创建一个字节数组输出流,输出流缓冲区的初始容量大小为 32 字节。 2、ByteArrayOutputStream(int size):创建一个字节数组输出流,输出流缓冲区的初始容量大小由参数 size 指定。 ByteArrayOutputStream 类中除了有前面介绍的字节输出流中的常用方法以外,还有如下两个方法。
(1)intsize():返回缓冲区中的当前字节数。(2)byte[] toByteArray():以字节数组的形式返回输出流中的当前内容。

5、文件输入流 FileInputStream 是 Java 流中比较常用的一种,它表示从文件系统的某个文件中获取输入字节。通过使用 FileInputStream 可以访问文件中的一个字节、一批字节或整个文件。 在创建 FileInputStream 类的对象时,如果找不到指定的文件将拋出 FileNotFoundException 异常,该异常必须捕获或声明拋出。 FileInputStream 常用的构造方法主要有如下两种重载形式。 **FileInputStream(File file):**通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。 **FileInputStream(String name):**通过打开一个到实际文件的链接来创建一个 FileInputStream,该文件通过文件系统中的路 径名 name 指定。

6、文件输出流 FileOutputStream 类继承自 OutputStream 类,重写和实现了父类中的所有方法。FileOutputStream 类的对象表示一个文件字节输出流,可以向流中写入一个字节或一批字节。在创建 FileOutputStream 类的对象时,如果指定的文件不存在,则创建一个新文件;如果文件已存在,则清除原文件的内容重新写入。FileOutputStream 类的构造方法主要有如下 4 种重载形式。 **FileOutputStream(File file):**创建一个文件输出流,参数 file 指定目标文件。 **FileOutputStream(File file,boolean append):**创建一个文件输出流,参数 file 指定目标文件,append 指定是否将数据添加到目标文件的内容末尾,如果为 true,则在末尾添加;如果为 false,则覆盖原有内容;其默认值为 false。 **FileOutputStream(String name):**创建一个文件输出流,参数 name 指定目标文件的文件路径信息。 **FileOutputStream(String name,boolean append):**创建一个文件输出流,参数 name 和 append 的含义同上。 **注意:**使用构造方法 FileOutputStream(String name,boolean append) 创建一个文件输出流对象,它将数据附加在现有文件的末尾。该字符串 name 指明了原文件,如果只是为了附加数据而不是重写任何已有的数据,布尔类型参数 append 的值应为 true。对文件输出流有如下四点说明:
1、在 FileOutputStream 类的构造方法中指定目标文件时,目标文件可以不存在。
2、目标文件的名称可以是任意的,例如 D:\abc、D:\abc.de 和 D:\abc.de.fg 等都可以,可以使用记事本等工具打开并浏览这些文件中的内容。
3、目标文件所在目录必须存在,否则会拋出 java.io.FileNotFoundException 异常。
4、目标文件的名称不能是已存在的目录。例如 D 盘下已存在 Java 文件夹,那么就不能使用 Java 作为文件名,即不能使用 D:\Java,否则抛出 java.io.FileNotFoundException 异常。

七、字符流的使用
尽管 Java 中字节流的功能十分强大,几乎可以直接或间接地处理任何类型的输入/输出操作,但利用它却不能直接操作 16 位的 Unicode 字符。这就要用到字符流。## 1、字符输入流 Reader 类是所有字符流输入类的父类,该类定义了许多方法,这些方法对所有子类都是有效的。 Reader 类的常用子类如下。 **CharArrayReader 类:**将字符数组转换为字符输入流,从中读取字符。 **StringReader 类:**将字符串转换为字符输入流,从中读取字符。 **BufferedReader 类:**为其他字符输入流提供读缓冲区。 **PipedReader 类:**连接到一个 PipedWriter。 **InputStreamReader 类:**将字节输入流转换为字符输入流,可以指定字符编码。

2、字符输出流 与 Reader 类相反,Writer 类是所有字符输出流的父类,该类中有许多方法,这些方法对继承该类的所有子类都是有效的。 Writer 类的常用子类如下。 **CharArrayWriter 类:**向内存缓冲区的字符数组写数据。 **StringWriter 类:**向内存缓冲区的字符串(StringBuffer)写数据。 **BufferedWriter 类:**为其他字符输出流提供写缓冲区。 **PipedWriter 类:**连接到一个 PipedReader。 **OutputStreamReader 类:**将字节输出流转换为字符输出流,可以指定字符编码。

3、字符文件输入流为了读取方便,Java 提供了用来读取字符文件的便捷类——FileReader。该类的构造方法有如下两种重载形式。
1、FileReader(File file):在给定要读取数据的文件的情况下创建一个新的 FileReader 对象。其中,file 表示要从中读取数据的文件。
2、FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新 FileReader 对象。其中,fileName 表示要从中读取数据的文件的名称,表示的是一个文件的完整路径。 在用该类的构造方法创建 FileReader 读取对象时,默认的字符编码及字节缓冲区大小都是由系统设定的。要自己指定这些值,可以在 FilelnputStream 上构造一个 InputStreamReader。 **注意:**在创建 FileReader 对象时可能会引发一个 FileNotFoundException 异常,因此需要使用 try catch 语句捕获该异常。 字符流和字节流的操作步骤相同,都是首先创建输入流或输出流对象,即建立连接管道,建立完成后进行读或写操作,最后关闭输入/输出流通道。

4、字符文件输出流Java 提供了写入字符文件的便捷类——FileWriter,该类的构造方法有如下
4种重载形式。 1、FileWriter(File file):在指定 File 对象的情况下构造一个 FileWriter 对象。其中,file 表示要写入数据的 File 对象。 2、FileWriter(File file,boolean append):在指定 File 对象的情况下构造一个 FileWriter 对象,如果 append 的值为 true,则将字节写入文件末尾,而不是写入文件开始处。 3、FileWriter(String fileName):在指定文件名的情况下构造一个 FileWriter 对象。其中,fileName 表示要写入字符的文件名,表示的是完整路径。 4、FileWriter(String fileName,boolean append):在指定文件名以及要写入文件的位置的情况下构造 FileWriter 对象。其中,append 是一个 boolean 值,如果为 true,则将数据写入文件末尾,而不是文件开始处。 在创建 FileWriter 对象时,默认字符编码和默认字节缓冲区大小都是由系统设定的。要自己指定这些值,可以在 FileOutputStream 上构造一个 OutputStreamWriter 对象。 FileWriter 类的创建不依赖于文件存在与否,如果关联文件不存在,则会自动生成一个新的文件。在创建文件之前,FileWriter 将在创建对象时打开它作为输出。如果试图打开一个只读文件,将引发一个 IOException 异常。 **注意:**在创建 FileWriter 对象时可能会引发 IOException 或 SecurityException 异常,因此需要使用 try catch 语句捕获该异常。

5、字符缓冲区输入流 BufferedReader 类主要用于辅助其他字符输入流,它带有缓冲区,可以先将一批数据读到内存缓冲区。接下来的读操作就可以直接从缓冲区中获取数据,而不需要每次都从数据源读取数据并进行字符编码转换,这样就可以提高数据的读取效率。BufferedReader 类的构造方法有如下两种重载形式。
1、BufferedReader(Reader in):创建一个 BufferedReader 来修饰参数 in 指定的字符输入流。
2、BufferedReader(Reader in,int size):创建一个 BufferedReader 来修饰参数 in 指定的字符输入流,参数 size 则用于指定缓冲区的大小,单位为字符。
除了可以为字符输入流提供缓冲区以外,BufferedReader 还提供了 readLine() 方法,该方法返回包含该行内容的字符串,但该字符串中不包含任何终止符,如果已到达流末尾,则返回 null。readLine() 方法表示每次读取一行文本内容,当遇到换行(\n)、回车(\r)或回车后直接跟着换行标记符即可认为某行已终止。

1、字符缓冲区输出流 BufferedWriter 类主要用于辅助其他字符输出流,它同样带有缓冲区,可以先将一批数据写入缓冲区,当缓冲区满了以后,再将缓冲区的数据一次性写到字符输出流,其目的是为了提高数据的写效率。BufferedWriter 类的构造方法有如下两种重载形式。
1、BufferedWriter(Writer out):创建一个 BufferedWriter 来修饰参数 out 指定的字符输出流。
2、BufferedWriter(Writer out,int size):创建一个 BufferedWriter 来修饰参数 out 指定的字符输出流,参数 size 则用于指定缓冲区的大小,单位为字符。 该类除了可以给字符输出流提供缓冲区之外,还提供了一个新的方法 newLine(),该方法用于写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行(\n)符。 **提示:**BufferedWriter 类的使用与 FileWriter 类相同。

八、转换流
正常情况下,字节流可以对所有的数据进行操作,但是有些时候在处理一些文本时我们要用到字符流,比如,查看文本的中文时就是需要采用字符流更为方便。所以 Java IO 流中提供了两种用于将字节流转换为字符流的转换流。 InputStreamReader 用于将字节输入流转换为字符输入流,其中 OutputStreamWriter 用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值