首页 > 代码库 > 流之阅读器和书写器(过滤器阅读器和过滤器书写器)
流之阅读器和书写器(过滤器阅读器和过滤器书写器)
InputStreamReader和OutputStreamWriter类就是相当于输入和输出流之上的装饰器,把面向字节的接口改为面向字符的接口。完成之后,就可以在它们之上使用面向字符的过滤器阅读器或过滤器书写器。与过滤器流一样,有很多子类可以完成特定的过滤工作,包括:
BufferedReader
BufferedWriter
LineNumberReader
PushbackReader
PrintWriter
BufferedReader和BufferedWriter类是基于字符的,对应于面向字节的BufferedInputStream和BufferedOutputStream类。BufferedInputStream和BufferedOutputStream中使用一个内部字节数组作为缓冲区,相应地,BufferedReader和BufferedWriter使用一个内部字符数组作为缓冲区。
当程序从BufferedReader读取时,文本会从缓冲区得到,而不是直接从底层输入流或其他文本源读取。当缓冲区请空时,将用尽可能多的文本再次填充,尽管这些文本不是全部都立即需要,这样可以使以后的读取速度更快。当程序写入一个BufferedWriter时,文本被放置在缓冲区中。只有当缓冲区填满或者当书写器显式刷新输出时,文本才会被移到底层输出流或其他目标,这使得写入也要快得多。
BufferedReader和BufferedWriter也有与阅读器和书写器关联的常用方法,如:read(),ready(),writer()和close()。这两个类都有两个构造函数,可以将BufferedReader或BufferedWriter串链到一个底层阅读器或书写器,并设置缓冲区的大小,如果没有设置大小,则使用默认的大小8192字符:
public BufferedReader(Reader in,int bufferSize) public BufferedReader(Reader in) public BufferedWriter(Writer out) public BufferedWriter(Writer out,int bufferSize)
我们使用BufferedReader来对上一节的示例重构一下:
package io; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class InputStreamReaderTest { public static void main(String[] args) { //注意这里 try(BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(new File("/home/fuhd/text")),"UTF8"),1024)){ int c; StringBuffer sb = new StringBuffer(); while((c = reader.read()) != -1){ sb.append((char)c); } System.out.println(sb.toString()); }catch(IOException e){ e.printStackTrace(); } } }
BufferedReader类还有一个readLine()方法,它读取一行文本,并作为一个字符串返回:
public String readLine() throws IOException
这个方法可以替代DataInputStream中已经废弃的readLine()方法,它与该方法的行为基本相同。主要的区别在于,通过将BufferedReader串链到InputStreamReader,你可以采用正确的字符集读取行,而不是采用平台的默认编码方式。如例:
package io; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class InputStreamReaderTest { public static void main(String[] args) { try(BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(new File("/home/fuhd/text")),"UTF8"),1024)){ System.out.println(reader.readLine()); //这里直接读一行 }catch(IOException e){ e.printStackTrace(); } } }
这个BufferedWriter类增加了一个其超类所没有的新方法,名为newLine(),也用于写入一行:
public void newLine() throws IOException
这个方法向输出插入一个与平台有关的行分隔符字符串。line.separator系统属性会确定这个字符串是什么:在Unix和Mac OS X下可能是换行,在Mac OS 9下是回车,在windows下是回车/换行对。由于网络协议一般会指定所需的行结束符,所以网络编程中不要使用这个方法,而应当显式地写入协议所需的行结束符。大多数情况下,所需的结束符都是回车/换行对。
流之阅读器和书写器(过滤器阅读器和过滤器书写器)