java bufferedreader 与inputstream的区别

Reader是字符流而stream是字节流。

BufferedReader   由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取分行文本很适合,BufferedReader是针对Reader的,不直接针对文件,也不是只针对文件读取。

是由java.io.InputStreamReade扩展来的,是针对文件读取的。

  实际使用时往往用 BufferedReader bfrTemp = new BufferedReader(new FileReader("test.conf"));先建立一个文件reader,再用BufferedReader读。

FileInputStream   扩展自java.io.InputStream,InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出来的是char数组或者String   ,使用InputStream读取出来的是byte数组。




http://www.cnblogs.com/lianghui66/p/3303546.html

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

分类:  java
绿色通道: 

### 回答1: BufferedReaderJava中的一个类,用于读取字符流,可以一次读取一行或多行,提高了读取效率。 InputStreamJava中的一个抽象类,用于读取字节流,可以从不同的数据源中读取数据,如文件、网络等。它的子类包括FileInputStream、ByteArrayInputStream等,可以根据不同的需求选择不同的子类来读取数据。 ### 回答2: BufferedReaderInputStream都是Java中用于读取输入流的类。 InputStream是抽象类,它是所有输入流的超类。其派生类有FileInputStream、ByteArrayInputStream、FilterInputStream、ObjectInputStream、PipedInputStream等,它们都继承了InputStream类,重写了父类的方法,实现了不同的输入流读取方式。 BufferedReader是读取字符缓冲区的类,它可以从一个输入流中快速读取字符,缓存字符并且一个一个的返回给应用程序。BufferedReader继承自Reader类,它可以读取字符,而不仅仅是字节。因为InputStream只能读取字节,所以开发者可以结合使用InputStreamInputStreamReader来读取字符流。 缓冲区的优点在于它可以减少磁盘和网络访问的次数。当应用程序从InputStream中读取字节时,Java虚拟机必须立即将它们提供给应用程序或者保存到缓存中,因为读操作需要的时间远远比写操作多得多。当应用程序读取InputStream时,JVM会在读取的字节中放置一个缓冲区,它会立即返回字节,而不必等待缓冲区被填满。因此,缓冲区允许Java在读操作时批量处理数据,这种批量处理可以降低磁盘和网络访问的次数,从而提高应用程序的性能。 BufferedReaderInputStream都有各自的优缺点。InputStream具有更好的灵活性和可读性,它可以按字节读取任何输入流,包括本地文件、Web浏览器流、Socket流、串口流、命令行等等。但是它不适合读取大量数据,因为它不能缓存数据,缓存的数据需要开发者手动处理。而BufferedReader则适用于读取缓冲区并缓存数据的情况。应用程序可以从BufferedReader中读取字符,处理这些字符,并且它可以自动管理缓存,从而优化读取性能。 因此,选择使用哪个类取决于应用程序的具体需求。当应用程序需要更高的灵活性和控制时,InputStream是一个不错的选择。当应用程序需要更高的性能时,可以使用BufferedReader来避免频繁的磁盘和网络访问。 ### 回答3: BufferedReaderJava中一个输入流的类,用于读取文本文件的数据。它可以一行一行读取文本数据,并且可以通过设置缓存区大小来提升读取速度。在Java中,BufferedReader通常搭配FileReader来使用,即首先通过FileReader打开一个文件,并得到文件的输入流,然后再将文件输入流传递给BufferedReader类的构造函数,以便读取文件内容。 相比之下,InputStreamJava中一个更为通用的输入流的类,用于读取任何类型的数据流,包括字节和字符等等。Java中的所有输入流都是基于InputStream类和其子类进行实现的,例如BufferedInputStream、ObjectInputStream等等。因此,在Java程序中,只要需要读取数据流时,都可以使用InputStream来进行处理。 同时需要注意的是,BufferedReaderInputStream都属于Java中的输入流的类,其主要区别在于读取数据的方式和应用场景的不同。在读取大文件时,InputStream会比BufferedReader更为高效,但在读取文本文件时,BufferedReaderInputStream更为适合。因此,在实际应用中,需要根据实际情况选择合适的输入流进行数据读取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值