java基础之IO流(二)之字符流
字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢?
字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写文本文件的。
有的小朋友也会问,字节流称之为万能流,为什么还要设计字符流呢。没错,字节流可以读写任意类型的文件,包括文本文件,对于读取整个文本文件来说,字符流和字节流都可以轻松完成,但是对于某些情况,字节流读取文本文件却相当复杂:
1)一个读取一个字符。
2)一次读取文本文件的一行。
当然这些问题统统是因为不同字符集编码造成的。另外也不难看出,构建一个字符流有一个很重要大家却经常忽略的参数,那就是字符集,由于缺省值的存在,所以字符编码的不指定在多数情况不会出现错误。
Reader和Writer是字符流的两个顶层抽象类。
Reader提供了三种读取数据的方法:读入一个字符(返回值为int)、读入一个字符数组,读入一个字符数组的一部分。
Writer提供了五种写数据的方法:一次写入一个字符(传入int类型)、一次写入一个字符数组、一次写入一个字符数组的一部分、一次写入一个字符串、一次写入一个字符串的一部分。
1.转换流(InputStreamReader和OutputStreamWriter)
InputStreamRreader:
InputStreamReader 是字节流通向字符流的桥梁:其内部维护了一个字节流,它使用底层字节流读取字节并按照指定的编码格式将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节(因为每个字符由不确定的字节个数组成)。
构造方法:
InputStreamReader(InputStream in):传入一个字节流,使用默认的字符编码方式(平台默认字符集)
InputStreamReader(InputStream in, String charsetName):传入指定字符集名称
InputStreanRreader(InputStream in, Charset cs):传入指定字符集对象
它的读取数据的方法并没有进行扩展和增加。
OutputStreamWriter:
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset
将要写入流中的字符编码成字节。
每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
构造方法与InputStreamReader相对应。写数据的方法也没有进行扩展。
2.FileReader和FileWriter
这两个流是转换流的简化类(子类),从名字上也可以看出,其针对的是文件系统的文本文件的读取,它使用平台默认字符集,而且既然是转换流,内部肯定维护一个字节流,FileReader维护一个FileInputStream对象,FileWriter维护一个FileOutputStream。
构造方法传入File对象或文件名,基本读写方法与其父类相同。
3.BufferedReader和BufferedWriter(缓冲字符流)
BufferedReader:
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求(开销比较大)。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader),便可减少底层读取次数,从缓冲区中读取。
构造方法:
BufferedReader(Reader in):默认缓冲区大小
BufferedReader(Reader in, int sz):指定缓冲区大小
读取方法中多了一个readLine()方法,每次可以读取文本文件的一行。
BufferedWriter:
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、字符数组和字符串的写入。内部维护一个缓冲区,减少底层字节流或字符流写入文件的次数,提高效率。
构造方法与BufferedReader想对应,多了一个自动换行的方法newLine()。
3.PrintWriter
向文本输出流打印对象的格式化表示形式。
与 PrintStream
类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。
此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError()
是否出现错误。
提供了打印各种基本数据类型和String的方法。也提供了带有自动换行功能的打印方法println()。