繁体   English   中英

Java客户端/服务器 - 使用BufferedWriter而不是PrintWriter

[英]Java Client/Server - Using BufferedWriter instead of PrintWriter

在Java客户端/服务器的所有示例中,我已经看到用于接收数据的BufferedReader ,例如

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintWriter一起发送数据,比如

PrintWriter writer = new PrintWriter(socket.getOutputStream());

但我不能只使用BufferedWriter而不是PrintWriter吗? 我只需要在客户端和服务器之间发送未格式化的字符串,因此BufferedWriter应该提供更好的性能(而不是这是一个问题)。

PrintWriter本质上提供了围绕Writer的便捷方法。 如果你不需要那些方便的方法 - 但只需要编写字符 - 那么在功能上,你可以使用你选择的任何类型的Writer,包括'raw'OutputStreamWriter。

如果您一次只编写一个字符,并且您的套接字流没有缓冲,那么建议在某处使用BufferedWriter或在原始输出流周围包装BufferedOuputStream进行缓冲。 通常不需要执行此操作的示例是在servlet中,传递给servlet的流通常已经缓冲。

PrintWriter还具有在写入方法上吞咽异常的“功能”,然后您必须使用checkError()[实际执行此操作,以及谁只是假定写入成功...]进行显式检查。 这可能是也可能不是......

当然你可以使用BufferedWriter PrintWriter通常用于协调,因为它提供了一系列功能而无需额外的异常处理(这通常使示例更容易)。 如果需要, PrintWriter还可以其操作委托BufferedWriter

关于性能,请参阅BufferedWriter的javadoc

通常,Writer会立即将其输出发送到基础字符或字节流。 除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriters和OutputStreamWriters。

PrintWriter有什么问题? 匹配是因为方便的readLine / writeLine匹配。 你在BufferedWriter中没有那么方便。 您还可以使用PrintWriter指定autoflush。
如果需要缓冲区,可以将BufferedWriter包装在PrintWriter中

PrintWriter pw = new PrintWriter( new BufferedWriter( ... ) );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM