@Cesar
2015-12-02T08:08:26.000000Z
字数 2024
阅读 2124
Java 学习在Java 1.1 中,对基本的IO流类的库做了重大的修改。尤其是Writer和Reader。它们是并不是用来替代InputStream和OutputStream的类。实际上InputStream和OutputStream在以面向字节形式的IO中仍然有着极其重要的作用,而Reader以及Writer则提供了兼容Unicode与面向字符的IO功能。此外,
package Test1202;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;/*** 新建一个类,取名叫TestIO,在src文件夹下新建一个TXT文档叫"test.txt"* 在文件中随意输入一些文字* @author Cesar**/public class TestIO {//文件位置public static final String filePath = "./src/test.txt";public static void main(String[] args) {File file = new File(filePath);InputStream in;try {in = new FileInputStream(file);//考虑编码格式InputStreamReader reader = new InputStreamReader(in,"UTF-8");//新建一个缓冲BufferedReader br = new BufferedReader(reader);String result ;while((result = br.readLine())!=null){System.out.println(result);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
例子解析:
从上面的例子很容易看出,设计Reader和Writer的目的主要是为了国际化,老的IO流只能支持8位的字节流,而不能很好的支持16位的unicode字符。所以添加该结构就是为了在所有的IO操作中都支持国际化的编码。同事,新的类的速度要好于老的IO类。
2.1. 为什么还要保留老式的IO
在某些场合,面向字节的InputStream和OutputStream才是正确的解决方案。比如java.util.zip就是面向字节的而不是面向字符的。因此,通常尽量先要弄明白我们的需求,然后再决定是使用哪一种流式读取。
2.2. 两种方式的映射
| 传统IO | Writer和Reader |
|---|---|
| InputStream | Reader(适配器:InputStreamReader) |
| OutputStream | Writer(适配器:OutputStreamWriter) |
| FileInputStream | FileReader |
| FileOutStream | FileWriter |
| StringBufferInputstream(已经弃用) | StringReader |
| 无 | StringWriter |
| ByteArrayInputstream | CharArrayReader |
| ByteArrayInputstream | CharArrayWriter |
| PipedInputStream | PipedReader |
| PipedOutputstream | PipedWriter |