Java 之 FileReader FileInputStream InputStreamReader BufferedReader 做用与区别


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

InputStream
| __FileInputStream 数组


FileInputStream 从文件系统中的某个文件中得到输入字节。
构造方法摘要
FileInputStream (File file)
经过打开一个到实际文件的链接来建立一个 FileInputStream ,该文件经过文件系统中的 File 对象 file 指定。
FileInputStream (FileDescriptor fdObj)
经过使用文件描述符 fdObj 建立一个 FileInputStream ,该文件描述符表示到文件系统中某个实际文件的现有链接。
FileInputStream (String name)
经过打开一个到实际文件的链接来建立一个 FileInputStream ,该文件经过文件系统中的路径名 name 指定。


Reader缓存

|——BufferedReader
|___InputStreamReader
|__FileReader 函数


BufferedReader : 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

构造方法摘要
BufferedReader (Reader in)
建立一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader (Reader in, int sz)
建立一个使用指定大小输入缓冲区的缓冲字符输入流。
BufferedReader (Java Platform SE 6)
BufferedReader的最大特色就是缓冲区的设置。一般Reader 所做的每一个读取请求都会致使对底层字符或字节流进行相应的读取请求,若是没有缓冲,则每次调用 read() 或 readLine() 都会致使从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
使用BufferedReader能够指定缓冲区的大小,或者可以使用默认的大小。大多数状况下,默认值就足够大了。
所以,建议用 BufferedReader 包装全部其 read() 操做可能开销很高的 Reader(如 FileReader 和InputStreamReader)。例如,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
将缓冲指定文件的输入。
InputStreamReader (Java Platform SE 6)
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集能够由名称指定或显式给定,或者能够接受平台默认的字符集。

构造方法摘要
InputStreamReader (InputStream in)
建立一个使用默认字符集的 InputStreamReader。
InputStreamReader (InputStream in, Charset cs)
建立使用给定字符集的 InputStreamReader。
InputStreamReader (InputStream in, CharsetDecoder dec)
建立使用给定字符集解码器的 InputStreamReader。
InputStreamReader (InputStream in, String charsetName)
建立使用指定字符集的 InputStreamReader。

每次调用 InputStreamReader 中的一个 read() 方法都会致使从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,能够提早从底层流读取更多的字节,使其超过知足当前读取操做所需的字节。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader最大的特色是能够指转换的定编码格式
,这是其余类所不能的,从构造方法就可看出,
这一点在读取中文字符时很是有用编码

FileReader
1)FileReader类介绍:
InputStreamReader类的子类,全部方法(read()等)都从父类InputStreamReader中继承而来;
2)与InputStreamReader类的区别:
构造方法摘要
FileReader (File file)
在给定从中读取数据的 File 的状况下建立一个新 FileReader 。
FileReader (FileDescriptor fd)
在给定从中读取数据的 FileDescriptor 的状况下建立一个新 FileReader 。
FileReader (String fileName)
在给定从中读取数据的文件名的状况下建立一个新 FileReader 操作系统

该类与它的父类InputStreamReader的主要不一样在于构造函数,主要区别也就在于构造函数!
从InputStreamReader的构造函数中看到,参数为InputStream和编码方式,能够看出,
当要指定编码方式时,必须使用InputStreamReader
类;而FileReader构造函数的参数与FileInputStream同,为File对象或表示path的String,能够看出,当要根据File对象或者String读取一个文件时,用FileReader;
我想FileReader子类的做用也就在于这个小分工吧。该类与它的父类InputStreamReader
的主要不一样在于构造函数,主要区别也就在于构造函数!
从InputStreamReader
的构造函数中看到,参数为InputStream和编码方式,能够看出,
当要指定编码方式时,必须使用InputStreamReader
类;而FileReader构造函数的参数与FileInputStream
同,为File对象或表示path的String,能够看出,当要根据File对象或者String读取一个文件时,用FileReader;
我想FileReader子类的做用也就在于这个小分工吧。
二 联系与区别
(1)字符与字节:
FileInputStream 类以二进制输入/输出,I/O速度快且效率搞,可是它的read()方法读到的是一个字节(二进制数据),很不利于人们阅读,并且没法直接对文件中的字符进行操做,好比替换,查找(必须以字节形式操做);
而Reader类弥补了这个缺陷,能够以文本格式输入/输出,很是方便;好比可使用while((ch = filereader.read())!=-1 )循环来读取文件;可使用BufferedReader的readLine()方法一行一行的读取文本。
(2)编码
InputStreamReader ,它是字节转换为字符的桥梁。 你能够在构造器重指定编码的方式,若是不指定的话将采用底层操做系统的默认编码方式,例如GBK等。
FileReader与InputStreamReader 涉及编码转换(指定编码方式或者采用os默认编码),可能在不一样的平台上出现乱码现象!而FileInputStream 以二进制方式处理,不会出现乱码现象.
所以要指定编码方式时,必须使用InputStreamReader 类,因此说它是字节转换为字符的桥梁;
(3) 缓存区
BufferReader类用来包装全部其 read() 操做可能开销很高的 Reader(如 FileReader 和InputStreamReader)。
(4)规范用法
总结以上内容,得出比较好的规范用法:
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);code

相关文章
相关标签/搜索