Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别

一直搞不清楚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);

时间: 2024-07-30 09:12:53

Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别的相关文章

Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区

ava.io下面有两个抽象类:InputStream和Reader InputStream是表示字节输入流的所有类的超类Reader是用于读取字符流的抽象类InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别.即用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组.弄清了两个超类的根本区别,再来看他们底下子类的使用,这里只对最常用的几个说明 InputStream    | __FileInputStre

转载:java中抽象类和接口的作用与区别

abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择显得比较随意. 其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于设计意图的理解是否正确.合理.

Java笔记--File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和区别

转自:http://hi.baidu.com/danghj/item/0ef2e2c4ab95af7489ad9e39 参考资料: l < core java > 12 章 l 使用 Java 操作文本文件的方法详解  http://java.ccidnet.com/art/3737/20041108/523627_1.html l FileReader 是什么类?和 FileInputStream 有什么不同?   http://book.hackbase.com/ask2/ask10757

java IO操作:FileInputStream,FileOutputStream,FileReader,FileWriter实例

FileInputStream   <span style="font-family:Verdana;">import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class TestFileInputStream { public static void main(String[] args) throws Exception { // 异常抛出, 不处理

FileInputStream(字节流)与fileReader(字符流) 的区别

FileInputStream 类 1 ) FileInputStream 类介绍: 以字节为单位的流处理.字节序列:二进制数据.与编码无关,不存在乱码问题. FileInputStream 类的主要方法有: Read (), read ( byte[] b ), read ( byte[],int off,int len ) ,available(); 2 ) FileInputStream 类与 FileReader 类的区别: 两个类的构造函数的形式和参数都是相同的,参数为 File 对象

JAVA键盘输入:Scanner和BufferedReader

public class ScannerTest { public static void main(String[] args) { Scanner sc=new Scanner(System.in); //sc.useDelimiter("\n"); while(sc.hasNext()) { System.out.println("content "+sc.next()); } } } System表示当前java程序的运行平台,无法创建System类的对象,

Java Socket 使用BufferedWriter和BufferedReader要注意readLine 以及换行标志的发送

当接收的类使用的是BufferedReader,发送的类是BufferedWriter的时候,要注意发送的一行要有换行标识符. 请看下面一个例子,服务器接收不到客户端的信息. 服务器: import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * Created by 290248126 on 14-5-10. */ public class Server { public static void ma

黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader

------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- /* 字符流的缓冲区技术: 对于一些大文件,如果读取一个字符才写一个字符,读写操作过于频繁. 为了解决这个问题,引入了缓冲区技术. 缓冲区技术是在流的基础上(必须要先有流)增强了流对于数据的操作效率. 就如同在水龙头上拿水喝,原本是一滴一滴

java中instanceof和getClass()的作用

初学者难免有点混淆java中instanceof和getClass()的作用,  下面就来一一讲解.    父类A: class A { }     子类B: class B extends A { }      构造对象 Object o1 = new A(); Object o2 = new B(); 一.instanceof     演示一: 1.o1 instanceof A => true  2.o1 instanceof B => false  3.o2 instanceof A