BufferedReader br1 = new BufferedReader(new InputStreamReader(new FileInputStream(new File(fileName))));
要读取一个文件,需要这样写。 以前年轻,没有去仔细想为什么。
最近仔细想想,如果直接用InputStreamReader 或者 FileInputStream 都是可以达到要求的。
然后自己试验了下。 文件很小没区别,但是如果是要读入的内容很多, 速度的差异很大。 特别是InputStreamReader 和 FileInputStream 达到了近十倍的速度差异。
想求教下为什么。 带来差异的原理是什么呢?
还有为什么不直接设计BufferedReader(File f)这样一个构造方法? 是因为没必要? 还是因为有特殊原因?javaiofile
要读取一个文件,需要这样写。 以前年轻,没有去仔细想为什么。
最近仔细想想,如果直接用InputStreamReader 或者 FileInputStream 都是可以达到要求的。
然后自己试验了下。 文件很小没区别,但是如果是要读入的内容很多, 速度的差异很大。 特别是InputStreamReader 和 FileInputStream 达到了近十倍的速度差异。
想求教下为什么。 带来差异的原理是什么呢?
还有为什么不直接设计BufferedReader(File f)这样一个构造方法? 是因为没必要? 还是因为有特殊原因?javaiofile
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.
就是依赖了实现,而没有依赖抽象,违背依赖倒置原则。
根据大家说的和自己在网上看到的,理解如下:
FileInputStream到InputStreamReader的改善是从每次读一个字节到每次读一个字符,InputStreamReader到BufferedReader的改善是从读一个字符到多个字符。 所以速度上有了不少的提升。
我这个理解有问题么?
不过我还有个问题。 1个字符是相当于2个字节的大小吧, 那FileInputStream改为InputStreamReader速度最多提升2倍吧。 但是为什么我自己试验下来有了10倍左右的提升呢?
我自己做的测试 完全相同的文件FileInputStream需要338秒,InputStreamReader只需要30秒。 10多倍的差距呢。 望高人解答。
* 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 之间的区别就可以了。
当然,设计模式上来讲,它们都应该属于行为模式,有些采用了装饰器模式。
普通的reader一次也不是只读一个字节 每次至少4K吧