将BufferedWriter和BufferedOutputStream一起使用是否过度?

Bru*_*uce 9 java sockets networking outputstream

我想写一个socket.从阅读网络IO,在我看来,写入它的最佳方式是做这样的事情:

OutputStream outs=null;
BufferedWriter out=null;
out =
  new BufferedWriter(
    new OutputStreamWriter(new BufferedOutputStream(outs),"UTF-8"));
Run Code Online (Sandbox Code Playgroud)

BufferedWriter将缓冲输入到OutputStreamWriter这是推荐的,因为它防止了从作家启动每个字符的编码器.

然后,BufferedOutputStream将缓冲来自的字节,Writer以避免一次将一个字节放到网络上.

它看起来有点像矫枉过正,但它似乎都有帮助吗?感谢任何帮助..

编辑:从javadoc上OutputStreamWriter:

每次调用write()方法都会导致在给定字符上调用编码转换器.生成的字节在写入底层输出流之前累积在缓冲区中.可以指定此缓冲区的大小,但默认情况下,它足够大,可用于大多数用途.请注意,传递给write()方法的字符不会被缓冲.

为了获得最高效率,请考虑在BufferedWriter中包装OutputStreamWriter,以避免频繁的转换器调用.例如:

Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
Run Code Online (Sandbox Code Playgroud)

mer*_*ike 7

Buffered*类的目的是将小写操作合并为更大的操作,从而减少系统调用的数量,并提高吞吐量.

由于BufferedWriter已经在缓冲区中收集写入,然后将缓冲区中的字符转换为另一个缓冲区,并在单个操作中将该缓冲区写入底层的OutputStream,因此已经使用大写操作调用了OutputStream.因此,BufferedOutputStream找不到任何组合,并且只是多余的.

顺便说一句,同样可以应用于BufferedWriter:缓冲只有在编写器一次只传递几个字符时才有用.如果你知道调用者只写了很大的字符串,那么BufferedWriter就会找不到任何东西来组合,也是多余的.


Jon*_*eet 2

BufferedWriter 会将输入缓冲到outputStreamWriter,建议这样做,因为它可以防止编写器为每个字符启动编码器。

由谁推荐,在什么背景下推荐?“启动编码器”是什么意思?无论如何,你一次给作家写一个角色吗?(我们不太了解您如何使用作家......这可能很重要。)

然后,BufferedOutputStream 将缓冲来自 Writer 的字节,以避免一次将一个字节潜在地放到网络上。

是什么让您认为它一次会写入一个字节?OutputStreamWriter我认为一次向底层写入器写入一个字节的可能性很小,除非您真的一次向其写入一个字符。

此外,我希望网络输出流使用类似Nagle 算法的算法来避免发送单字节数据包。

与优化一样,您应该基于证据进行优化...您是否在使用或不使用这些缓冲层的情况下进行过任何测试?

编辑:只是为了澄清,我并不是说缓冲类是无用的。在某些情况下,它们绝对是正确的选择。我只是说,与所有优化一样,它们不应该盲目使用。您应该考虑要优化的内容(处理器使用情况、内存使用情况、网络使用情况等)并进行测量。这里有很多因素很重要——尤其是写入模式。如果您已经“大块地”写入(写入大块字符数据),那么缓冲区的影响相对较小。如果你实际上一次给作家写一个角色,那么它们会更重要。