Java Tutorials处的代码显示了使用DataOutputStream
类和DataInputStream
类的示例。
代码片段如下所示:
//..
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
//..
in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
//..
我想知道为什么在创建新的BufferedOutputStream
时需要创建新的DataOutputStream
?
这不是多余的,因为这个替代方案也有效吗? :new DataOutputStream(new FileOutputStream(dataFile));
作为this page声明,DataStreams已经提供了缓冲文件输出字节流。那么“双缓冲”真的需要吗?
我修改了2行代码(输出和输入),取消了BufferedOutputStream
和BufferedInputStream
,一切似乎都运行得很好,所以我想知道这是什么目的BufferedOutputStream
和BufferedInputStream
?
答案 0 :(得分:9)
在BufferedOutputStream中包装FileOutputStream通常会加快程序的整体输出速度。只有在编写大量数据时才会注意到这一点。在BufferedInputStream中包装InputStream也是一样的。使用缓冲区只会影响效率,而不是正确性。
答案 1 :(得分:2)
我曾经认为Java IO模型不必要地大,但现在我真的“得到它”我发现它非常优雅。 BufferedOutputStream是Decorator模式的一个实现(google it ...它很有用)。这意味着BufferedOutputStream只是将功能添加到它包装的输出流中。在内部,BufferedOutputStream调用它装饰的OutputStream。
答案 2 :(得分:1)
缓冲IO流可帮助您批量读取,从而显着降低IO成本。 IO过程相当昂贵。想象一下,您的应用程序对读取/写入的每个字节执行完整的读/写循环,而不是一次读取/写入大量数据。执行缓冲读/写肯定非常有效。如果你在两种情况下收集一些性能统计数据,你会注意到效率的巨大差异,即w和没有缓冲IO,特别是在读/写大量数据时。