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

解决方案 »

  1.   

    public class BufferedReader
    extends ReaderReads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.In general, each read request made of a Reader causes a corresponding read request to be made of the underlying character or byte stream. It is therefore advisable to wrap a BufferedReader around any Reader whose read() operations may be costly, such as FileReaders and InputStreamReaders. For example, BufferedReader in
       = new BufferedReader(new FileReader("foo.in"));
     will buffer the input from the specified file. Without buffering, each invocation of read() or readLine() could cause bytes to be read from the file, converted into characters, and then returned, which can be very inefficient.Programs that use DataInputStreams for textual input can be localized by replacing each DataInputStream with an appropriate BufferedReader. 
      

  2.   

    速度慢,是缺少了BufferedReader所提供的缓存机制这是装饰者模式,可以灵活装配配所需要的功能如果设计成这个BufferedReader(File f),相比起BufferedReader(Reader in)它依赖的范围很小,使用范围就狭窄,从设计模式角度来说的话,
    就是依赖了实现,而没有依赖抽象,违背依赖倒置原则。
      

  3.   

    Java流的设计是装饰器模式的经典使用案例,每包装一层都意味着新特性的增加。
      

  4.   

    File做参数试用范围太小了另外,new BufferedReader(new FileReader(fileName));即可
      

  5.   

    用buffer的话 写完文件如果忘记close的话 文件会不完整 结尾掉了一部分 如果调用了flush的话就不会 说明不是你执行一次write就写真的写一次文件
      

  6.   

    多谢各位回帖!
    根据大家说的和自己在网上看到的,理解如下:
    FileInputStream到InputStreamReader的改善是从每次读一个字节到每次读一个字符,InputStreamReader到BufferedReader的改善是从读一个字符到多个字符。 所以速度上有了不少的提升。
    我这个理解有问题么?
    不过我还有个问题。  1个字符是相当于2个字节的大小吧, 那FileInputStream改为InputStreamReader速度最多提升2倍吧。 但是为什么我自己试验下来有了10倍左右的提升呢?
    我自己做的测试 完全相同的文件FileInputStream需要338秒,InputStreamReader只需要30秒。 10多倍的差距呢。 望高人解答。
      

  7.   

    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也是缓冲来的
      

  8.   

    程序访问外设,等待数据的时间较长(几十上百毫秒,甚至几秒不等),
    采用缓存技术(BufferedXXX,比如BufferedReader),可以一次性多读写一些数据,提高外设数据的访问效率。
    外设的数据,如果是字符数据(或者其他需要解码过程的数据),读取时可以使用Reader,XXXReader完成二进制数据向字符数据的换换过程(解码过程)。
    InputStream是对外设二进制数据的一个封装,用来读取二进制数据的行为类。楼主说的提高近十倍的效率,应该是采用BufferedReader之后的效果,普通Reader一般不会太快。楼主只要认清 XXXStream 、 XXXReader/XXXWriter 、 BufferedXXX 之间的区别就可以了。
    当然,设计模式上来讲,它们都应该属于行为模式,有些采用了装饰器模式。
      

  9.   

    没采用哦。 只采用了inputstreamreader
      

  10.   

    这个跟字符字节没有关系
    普通的reader一次也不是只读一个字节 每次至少4K吧