【问题标题】:Java IO (javase 6)- Help me understand the effects of my sample use of Streams and WritersJava IO (javase 6) - 帮助我了解示例使用 Streams 和 Writers 的效果
【发布时间】:2010-02-11 09:27:36
【问题描述】:
BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream("out.txt") ) ) );

让我看看我是否理解这一点:为文件“out.txt”打开一个字节输出流。然后将其馈送到缓冲的输出流以使文件操作更快。缓冲的流被馈送到输出流写入器以从字节到字符桥接。最后,这个 writer 被馈送到一个缓冲的 writer... 这又增加了一层缓冲?

嗯……

【问题讨论】:

  • 在我看来是多余的......
  • 是的,这就是为什么我想知道这是做什么的,特别是

标签: file-io stream java writers


【解决方案1】:

是的,你是对的。

我认为在这种情况下你可以做得更短(另见BufferedWriter

BufferedWriter out = new BufferedWriter(new FileWriter("foo.out"));

或者如果你想要漂亮的打印功能:

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

FileWriter 可能会创建自己的包装,但该类会知道哪种方式最好。

在 java 中,Streams 和 Writers 是包装器,因此您可以根据自己的需要组装它们(通过像您一样堆叠它们)。这些类不查看它们堆叠在哪种类型的流/写入器上。在您的情况下,拥有多个缓冲区意味着您实际上有两个缓冲区,位于两个不同的类中。这意味着它们会占用一些额外的内存并可能会造成一些性能损失,但您很可能永远不会注意到这一点(因为与其他性能因素相比,这只是一点点开销)。

【讨论】:

  • 是的,但在我的示例中,两层缓冲有什么作用?
  • 没什么用的,我猜。可能是额外的内存消耗。如果您真的感兴趣,请进行基准测试。
  • 这就是我的猜测。现在我想知道摆脱 BufferedWriter 并离开 BufferedOutputStream 是否会比它的倒数更好……嗯,我只是好奇。还是谢谢。
  • 以上是从官方api复制过来的。所以你应该使用它。 (它不会创建任何显式流,因此实际的 FileWriter 可以做最有效的事情)。
【解决方案2】:

这是decorator pattern 的示例。这个想法是在不修改类的情况下向类添加功能。在您的示例中,您有一个 FileWriter。您希望在写入之前首先缓冲您写入的任何内容(如果是通过网络,这是个好主意)。因此,您将 BufferedWriter 放在 FileWriter 之上。其他应用可能不希望数据被缓冲,因此开发人员不需要添加 BufferedWriter。

我们无法预测所有开发人员都需要什么。假设您需要 rot13 您的数据,现在您无需修改​​ FileWriter,而是创建一个名为 Rot13Writer 的类来实现 Writer。 Rot13Writer 将获取 Writer 的一个实例,并在将其传递给下一个 writer 之前执行 rot13。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2010-11-17
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多