InputStream和Reader的区别(转载)

InputStream和Reader的区别

   

java.io下面有两个抽象类:InputStream和Reader

InputStream是表示字节输入流的所有类的超类

Reader是用于读取字符流的抽象类

InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。

即用Reader读取出来的是char数组或者String
,使用InputStream读取出来的是byte数组。

弄清了两个超类的根本区别,再来看他们底下子类的使用,这里只对最常用的几个说明

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);

时间: 2024-10-03 01:44:46

InputStream和Reader的区别(转载)的相关文章

java 字节流和字符流的区别 转载

转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示. 下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流.范例:使用字节流不关闭执行 Java

InputStream和Reader

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

Java InputStream和Reader

1. 字节流和字符流的区别: 字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符. 2. 节点流和处理流的区别: 可以从/向一个特定的IO设备(如磁盘.网络)读.写数据的流,称为节点流,也被称为低级流. 处理流则用于对一个已经存在的流进行连接或封装,通过封装后的流实现数据读写功能. 3. InputStream 和 Reader InputStream 和 Reader 是所有输入流的抽象基类,本身不能创建实例或执行输入,但成为所有输入流的模板,它们的方法是所有输入流都可使用

out,ref的作用和区别(转载)

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量.它们的区别是: 1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字.以满足匹配. 3.out适合用在需要retrun多个返回值

定义c/c++全局变量/常量几种方法的区别(转载)

出自:http://www.cnblogs.com/yaozhongxiao/archive/2010/08/08/1795338.html 在讨论全局变量之前我们先要明白几个基本的概念:  1. 编译单元(模块): 在ide开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误 (link error)  因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用 gcc,makefile等工具在linux或者嵌入

asp.net mvc(模式)和三层架构(BLL、DAL、Model)的联系与区别 转载自:http://blog.csdn.net/luoyeyu1989/article/details/8275866

首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BLL(业务逻辑层).WEB层各司其职,意在职责分离. MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的WEB层,也就是说,MVC把三层架构中的WEB层再度进行了分化,分成了控制器.视图.实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话:而C层直接与三层中的BLL进行对话. 所以, .net的三层结构中,并没有action这个概念. asp.net mvc 是微软新发布

String 、InputStream、Reader 的转换

1.String –> InputStream InputStrem is = new ByteArrayInputStream(str.getBytes());orByteArrayInputStream stream= new ByteArrayInputStream(str.getBytes()); 2.InputStream–>String inputStream input; StringBuffer out = new StringBuffer();     byte[] b =

进程和线程的区别 转载

很经典的一个博客 转载的 转自:http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高.另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率.线程在执行过程中与进程还是有区别的.每个独立的线程有一个程序运行的入口.顺序执行序列和程序的出口.但是线程不能够独立执行,必须依存在应用程序中

Minitab中相关系数R-Sq和修正R-Sq(adj)的意思,计算公式和区别[转载]

转载自:http://www.pinzhi.org/thread-7762-1-1.html Minitab中相关系数R-Sq和修正的相关系数R-Sq(adj)的意思,计算公式和区别 在Minitab做回归方程,或类似的运算中,经常会碰到多元相关系数R-Sq和修正的多元相关系数R-Sq(adj),那么,这2个是什么意思?具体的计算公式和区别是什么? 拟合的总效果多元全相关系数(Multiple correlation coefficient) R²(即R=Sq)和修正的多元相关系数(Adjust