@Cesar
2015-12-02T16:08:26.000000Z
字数 2024
阅读 1921
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 |