java I / O:为什么输入和输出流都不匹配?

时间:2014-02-20 05:20:58

标签: java sockets file-io

我正在尝试构建一个客户端 - 服务器java应用程序。在线使用大量的示例程序,我注意到每个人都有自己的变化,关于使用哪个流以及将它包装到哪个流中。

但是,我的主要问题是,我想知道为什么输入流和输出流不必匹配,如下面的示例代码所示:

Socket clientSocket = new Socket("localhost", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(
    new InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();

例如,不应该将outputStream包装在BufferedWriter()中吗?

1 个答案:

答案 0 :(得分:2)

它们不必匹配,因为每个流都独立存在(尽管与相同的Socket实例相关联)。如果以一种方式处理流导致副作用需要您以某种方式处理第二个完全独立的流,那么Java API将不会非常合理。

没有什么能阻止您使用类似的方法来处理输入和输出流。但也没有必要。一般而言,您应该更多地考虑您想要的行为(以及您正在实现的任何通信协议的有意义),而不是使用“相同”类来管理输入和输出

例如,如果要逐行读取文本数据,请使用BufferedReader。如果您正在读取换行符不具有特殊意义的二进制数据,则使用此类是不合适的。

同样,如果要输出文本数据,使用BufferedWriter这样做是合理的。但是如果需要输出二进制数据,通常不会这样做。

所以它真的取决于最适合您需求/用例的内容。有时您的输入和输出要求是相同的。有时不是。开发人员的工作是了解需求,并使用最合适的工具来解决问题。