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

Java客户机/服务器-使用BufferedWriter而不是PrintWriter,java,client-server,Java,Client Server,在Java客户机/服务器的所有示例中,我都见过用于接收数据的BufferedReader,如 BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 和PrintWriter用于发送数据,如 PrintWriter writer = new PrintWriter(socket.getOutputStream()); 但是我不能用一个BufferedWriter而不

在Java客户机/服务器的所有示例中,我都见过用于接收数据的
BufferedReader
,如

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter
用于发送数据,如

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

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

确保可以使用
BufferedWriter
PrintWriter
通常用于方便性,因为它提供了一系列功能,而不需要额外的异常处理(这通常使示例更容易)。如果需要,
PrintWriter
也可以将其操作委托给
BufferedWriter

关于性能,请参阅javadocs

通常,写入程序将其输出立即发送到底层字符或字节流。除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的编写器周围,例如FileWriter和OutputStreamWriter


PrintWriter有什么问题?匹配是因为方便的读/写线匹配。在BufferedWriter中没有这种方便。您还可以使用PrintWriter指定自动刷新。
如果需要缓冲区,可以将BufferedWriter包装到PrintWriter中

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

PrintWriter本质上为编写器提供了方便的方法。如果您不需要这些方便的方法,而只需要编写字符,那么在功能上,您可以使用您选择的任何类型的Writer,包括“原始”OutputStreamWriter

如果一次只写一个字符,而套接字流没有缓冲,那么建议在某个地方放一些缓冲,或者使用BufferedWriter,或者在原始输出流周围包装BufferedUpoutStream。通常不需要这样做的一个例子是在servlet中,传递到servlet的流通常已经被缓冲


PrintWriter还有一个“功能”,即在写入方法上接受异常,然后必须使用checkError()显式检查异常[举手确认是谁实际执行了此操作,谁只是假设写入成功…]。这可能是可取的,也可能不是可取的…

我打赌性能差异将是最小的,如果有的话。你试过使用BufferedWriter吗?您使用它应该没有问题。BufferedWriter的问题是,当我调用
write()
@Helper方法时,它似乎会阻塞,这是因为它在写入数据之前会缓冲数据(直到其内部缓冲区已满)。如果您正在发送带有缓冲的套接字,然后记住,在(a)缓冲区已满或(b)显式调用flush()之前,发送的内容不会到达另一端。因此,如果您已经完成了编写另一端需要接收的重要“数据包”的工作,那么您需要记住调用flush(),否则另一端可能无法获得它,事情就会变得悬而未决。@someguy:这没有意义。除非缓冲区被填满,否则缓冲将阻止阻塞。如果需要,BufferedWriter有一个newLine()方法;换行符();bw.flush();当然,根据你所做的事情,异常吞咽更容易引入bug。这是马的课程。。。