在Java客户端/服务器的所有示例中,我看到BufferedReader
用于接收数据,例如
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
和PrintWriter
用于发送数据,例如
PrintWriter writer = new PrintWriter(socket.getOutputStream());
但我不能只使用BufferedWriter
代替PrintWriter
吗?我只需要在客户端和服务器之间发送未格式化的字符串,因此BufferedWriter
应该提供更好的性能(不是这是一个问题)。
答案 0 :(得分:3)
PrintWriter实质上提供了围绕Writer的便捷方法。如果你不需要那些方便的方法 - 但只需要编写字符 - 那么在功能上,你可以使用你选择的任何类型的Writer,包括'raw'OutputStreamWriter。
如果你一次只编写一个字符,并且你的套接字流没有缓冲,那么建议在某个地方放置一些缓冲,或者使用BufferedWriter或者在原始输出流周围包装BufferedOuputStream。通常不需要执行此操作的示例是在servlet中,传递给servlet的流通常已经缓冲。
PrintWriter还具有在写入方法上吞咽异常的“功能”,然后您必须使用checkError()[实际执行此操作,以及谁只是假定写入成功...]进行显式检查。这可能是也可能不是......
答案 1 :(得分:2)
当然可以使用BufferedWriter
。 PrintWriter
通常用于 conveniance ,因为它提供了一系列功能而无需额外的异常处理(这通常会使示例更容易)。如果需要,PrintWriter
还可以委托将其操作委托给BufferedWriter
。
关于性能,请参阅BufferedWriter
通常,Writer会立即将其输出发送到基础字符或字节流。除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriters和OutputStreamWriters。
答案 2 :(得分:2)
PrintWriter有什么问题?匹配是因为方便的readLine / writeLine匹配。你在BufferedWriter中没有那么方便。您还可以使用PrintWriter指定autoflush 如果需要缓冲区,可以将BufferedWriter包装在PrintWriter
中PrintWriter pw = new PrintWriter( new BufferedWriter( ... ) );