日期:2014-05-20  浏览次数:20612 次

JAVA IO流的疑惑求解~
BufferedReader br1 = new BufferedReader(new InputStreamReader(new FileInputStream(new File(fileName))));
要读取一个文件,需要这样写。  以前年轻,没有去仔细想为什么。
最近仔细想想,如果直接用InputStreamReader 或者 FileInputStream 都是可以达到要求的。
然后自己试验了下。 文件很小没区别,但是如果是要读入的内容很多, 速度的差异很大。 特别是InputStreamReader 和 FileInputStream 达到了近十倍的速度差异。 
想求教下为什么。 带来差异的原理是什么呢? 
还有为什么不直接设计BufferedReader(File f)这样一个构造方法? 是因为没必要? 还是因为有特殊原因?
java io file

------解决方案--------------------
速度慢,是缺少了BufferedReader所提供的缓存机制

这是装饰者模式,可以灵活装配配所需要的功能

如果设计成这个BufferedReader(File f),相比起BufferedReader(Reader in)

它依赖的范围很小,使用范围就狭窄,从设计模式角度来说的话,
就是依赖了实现,而没有依赖抽象,违背依赖倒置原则。
------解决方案--------------------
Java流的设计是装饰器模式的经典使用案例,每包装一层都意味着新特性的增加。
------解决方案--------------------
File做参数试用范围太小了

另外,new BufferedReader(new FileReader(fileName));即可
------解决方案--------------------
用buffer的话 写完文件如果忘记close的话 文件会不完整 结尾掉了一部分 如果调用了flush的话就不会 说明不是你执行一次write就写真的写一次文件
------解决方案--------------------
引用:
多谢各位回帖!
根据大家说的和自己在网上看到的,理解如下:
FileInputStream到InputStreamReader的改善是从每次读一个字节到每次读一个字符,InputStreamReader到BufferedReader的改善是从读一个字符到多个字符。 所以速度上有了不少的提升。
我这个理解有问题么?
不过我还有个问题。  1个字符是相当于2个字节的大……

我觉得10倍速度的差异绝对不会是因为按字节还是按字符传输,甚至2倍都不会
因为传输方式都是流的形式,没有“次”的概念,差异只是在传输单元上,一个是字节,一个是字符,但字符的信息量不也是两个字节吗?不会造成快慢吧
------解决方案--------------------
Each invocation of one of an InputStreamReader's read() methods may
 * cause one or more bytes to be read from the underlying byte-input stream.
 * To enable the efficient conversion of bytes to characters, more bytes may
 * be read ahead from the underlying stream than are necessary to satisfy the
 * current read operation.
看看源码呗,这个是里面的注释
其实inputstreamreader也是缓冲来的
------解决方案--------------------
程序访问外设,等待数据的时间较长(几十上百毫秒,甚至几秒不等),
采用缓存技术(BufferedXXX,比如BufferedReader),可以一次性多读写一些数据,提高外设数据的访问效率。
外设的数据,如果是字符数据(或者其他需要解码过程的数据),读取时可以使用Reader,XXXReader完成二进制数据向字符数据的换换过程(解码过程)。
InputStream是对外设二进制数据的一个封装,用来读取二进制数据的行为类。

楼主说的提高近十倍的效率,应该是采用BufferedReader之后的效果,普通Reader一般不会太快。

楼主只要认清 XXXStream 、 XXXReader/XXXWriter 、 BufferedXXX 之间的区别就可以了。
当然,设计模式上来讲,它们都应该属于行为模式,有些采用了装饰器模式。


------解决方案--------------------
引用:
多谢各位回帖!
根据大家说的和自己在网上看到的,理解如下:
FileInputStream到InputStreamReader的改善是从每次读一个字节到每次读一个字符,InputStreamReader到BufferedReader的改善是从读一个字符到多个字符。 所以速度上有了不少的提升。
我这个理解有问题么?
不过我还有个问题。  1个字符是相当于2个字节的大……

这个2倍是lz自己理解的,底层读字符与字节的倍数估计不是2倍的差距。
纯属个人理解!
------解决方案--------------------
这个跟字符字节没有关系
普通的reader一次也不是只读一个字节 每次至少4K吧
------解决方案--------------------