一直搞不清楚FileReader FileInputStream InputStreamReader BufferedReader 之间的区别联系,每次写读取文档的java程序都是网上百度。今天专门就这个问题进行了深入探讨。

    一、来源

java.io下有两个抽象类InputStream和Reader,上述类都是继承了这两个超类。它们之间区别是:InputStream是字节流的输入,Reader是字符流输入。

    二、具体每类

InputStream 
   | __FileInputStream 

FileInputStream 集成自InputStream,可以读取制定FILE或路径的文件。

Reader
   |——BufferedReader 
   |___InputStreamReader 
         |__FileReader 

BufferedReader:从字符输入流中读取文本,并缓冲各个字符。它最重要的一点就是:有缓冲,不用像其他Reader一样每次读取都从底层字节或字符流读取。

InputStreamReader:字节流到字符流的桥梁。其重要特点是:可以使用指定的编码格式。

FileReader:是InputStreamReader的子类,其和父类主要区别在构造函数不同,当根据File或String读取文件时用FileReader。

    三、要点

    1、InputStreamReader ,它是字节转换为字符的桥梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。 
FileReader与InputStreamReader 涉及编码转换(指定编码方式或者采用os默认编码),可能在不同的平台上出现乱码现象!而FileInputStream 以二进制方式处理,不会出现乱码现象. 
因此要指定编码方式时,必须使用InputStreamReader 类,所以说它是字节转换为字符的桥梁;

    2为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如: 
 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    3、规范用法
总结以上内容,得出比较好的规范用法: 
1) File file = new File ("hello.txt"); 
FileInputStream in=new FileInputStream (file); 
2) File file = new File ("hello.txt"); 
FileInputStream in=new FileInputStream (file); 
InputStreamReader inReader=new InputStreamReader (in,"UTF-8"); 
BufferedReader bufReader=new BufferedReader(inReader); 
3) File file = new File ("hello.txt"); 
FileReader fileReader=new FileReader(file); 
BufferedReader bufReader=new BufferedReader(fileReader);