【问题标题】:Why do we only buffer the input in networking? [closed]为什么我们只缓冲网络中的输入? [关闭]
【发布时间】:2013-03-16 00:27:20
【问题描述】:

所以我最近了解到标准basic networking in Java 是这样的:

out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));

我只是想澄清一下,所以对于输出,我们不使用BufferedWriter,因为这是服务器端的工作?做这样的事情会不会错:

out =  new BufferedWriter(PrintWriter(echoSocket.getOutputStream(), true));

【问题讨论】:

  • 没有人会认真地将PrintWriter 用于网络 I/O。
  • @BrianRoach - 这是一个好点,那么用什么代替呢?
  • 这取决于你在做什么。根据您正在编写的内容和编写方式,您可以使用许多包装器。 (是的,这很模糊,但没有简单的答案)。例如,new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) 对于基本网络 I/O 来说可能很常见。
  • 我们会缓冲输出。这不是 Java 中标准的基本网络。 PrintWriter 缓冲输出。不是一个真正的问题。
  • @BrianRoach - 非常感谢!到时候我会好好学习的。

标签: java sockets bufferedreader bufferedwriter


【解决方案1】:

来自 Java 文档:

http://docs.oracle.com/javase/tutorial/essential/io/buffers.html

到目前为止,我们看到的大多数示例都使用无缓冲 I/O。这意味着每个读取或写入请求都由 底层操作系统。这会使程序的效率大大降低,因为每个 此类请求通常会触发磁盘访问、网络活动或某些 其他相对昂贵的操作。

为了减少这种开销,Java 平台实现了缓冲 I/O 流。缓冲输入流从内存中读取数据 称为缓冲区的区域;本机输入 API 仅在 缓冲区为空。同样,缓冲的输出流将数据写入 缓冲区,并且仅在缓冲区被调用时才调用本机输出 API 满了。

是的,“缓冲”输入 AND 输出通常是个好主意。

恕我直言...

PS:

我认为 PrintWriter 没有任何问题。特别是如果我想直接对套接字执行“printf()”样式的文本 I/O。

【讨论】:

  • 我对@9​​87654322@ 的看法是,您在任何实际应用程序中都不会这样做。
  • 很公平:)。但是,如果我想在端口 80 上打开一个套接字并手动“printf()”我自己的 HTTP 标头和内容——那么“PrinterWriter”可能就是我这样做的方式。 PrintWriter 本质上没有任何“错误”。
  • 不过要小心换行。 HTTP 需要 \r\n,PrintWriter 使用系统默认换行符。
  • @zhong.j.yu - 好点 - 谢谢!
  • PrintWriter 和 PrintStream 的本质错误是它们吞下异常并且无法知道它们是什么:只有一点信息表明发生了异常。这在网络编程中是不够的。您至少需要能够将自己的错误(SocketClosedException 等)与网络问题、对等问题...
【解决方案2】:

我不会称该示例为“标准”。这是一个简单的教程。它使用BufferedReader 不是用于缓冲,而是用于BufferedReader.readLine() 方法。

对于一个严肃的应用程序,是的,输出应该被缓冲。你不应该写很多小数据。如果不出意外,每个 write() 的系统调用开销是一个杀手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2012-12-06
    • 2020-05-15
    • 2011-02-25
    相关资源
    最近更新 更多