说说 Java I/O 系统之 Reader 与 Writer

来源:互联网 发布:软件使用费增值税税率 编辑:程序博客网 时间:2024/05/18 02:26

之前说的 InputStream 和 OutputStream 是以字节的方式提供 I/O 功能,而 Reader 和 Writer 是以兼容 Unicode 和面向字符的方式提供 I/O 功能。

有时候需要把字节处理类与字符处理类结合起来,这就需要用到适配器类:

  • InputStreamReader 把 InputStream 转换为 Reader。
  • OutputStreamWriter 把 OutputStream 转换为 Writer。

旧的 I/O 流继承结构仅支持 8 位字节流,这无法很好地支持 16 位的 Unicode 字符。所以设计了 Reader 与 Writer,用以支持字符的国际化功能。而且新类库的操作会比旧库执行的更快!

1 对比新旧 I/O 类

有些场合使用字节才是正确的解决之道,比如 java.util.zip。所以应该先尽量使用 Reader 和 Writer,Reader 和 Writer 处理不了,再用面向字节流的库。

Java 1.0 Java 1.1 InputStream Reader(适配器:InputStreamReader) OutputStream Writer(适配器:OutputStreamReader) FileInputStream FileReader FileOutputStream FileWriter StringBufferInputSream(弃用) StringReader - StringWriter ByteArrayInputStream CharArrayReader ByteArrayOutputStream CharArrayWriter PipedInputStream PipedReader PipedOutputStream PipedWriter

可以看出 Java 1.0 与 Java 1.1 的 I/O 继承结构非常相似!

2 改变流的行为

一般是通过装饰器类来改变流的行为。下列是新旧装饰器类的对比列表:

Java 1.0 Java 1.1 FilterInputStream FilterReader FilterOutputStream FilterWriter(抽象类) BufferedInputStream BufferedReader BufferedOutputStream BufferedWriter DataInputStream 需要用到 readLine() 方法时,使用 BufferedReader;否则使用 DataInputStream。 PrintStream PrintWriter LineNumberInputStream(弃用) LineNumberReader StreamTokenizer StreamTokenizer(使用接受 Reader 的构造器) PushbackInputStream PushbackReader

Java SE5 中新增了 PrintWriter 构造器,它可以简化写文件的过程。它还有一个自动清空选项,如果设置了这个选项,就会在每次执行 println() 后,自动清空。

3 未发生变化的类

  • DataOutputStream
  • File
  • RandomAccessFile
  • SequenceInputStream
原创粉丝点击