1
BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream("out.txt") ) ) );

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

唔...

4

2 回答 2

3

是的,你是对的。

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

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

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

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

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

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

于 2010-02-11T09:37:41.153 回答
0

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

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

于 2010-04-12T03:42:22.610 回答