【问题标题】:Difference between methods to read a byte from TCP server?从 TCP 服务器读取字节的方法之间的区别?
【发布时间】:2020-07-23 01:30:29
【问题描述】:

我正在尝试使用 TCP 协议读取为 android 上的客户端发送的信息。在我的服务器中,我有以下代码:

InputStream input = clienteSocket.getInputStream();
int c = input.read();

c 将包含客户端发送的 ascci 编号。

我也可以这样写:

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

我想知道这两种方法有什么区别。

【问题讨论】:

  • 您只需要来自客户端的 a(单个)字节还是流中的所有内容?
  • (a) 定义“最佳”。 (b) 你确实意识到一个给你一个字节,另一个给你一个字符? (c) 你混淆了“来自客户端”和“来自服务器”,并不是说它有丝毫区别。

标签: java android tcpclient


【解决方案1】:

你在这里比较的是苹果和橘子。

  • 您的第一个示例从流中读取一个未缓冲的字节,然后返回该字节的值。 (添加“ASCII 数字”不会添加任何实际信息。)
  • 您的第二个示例设置了一个缓冲读取器,它可以从流中读取字符,缓冲,但它实际上不读取任何内容。

您可以再设置两个示例:

InputStream is = new BufferedInputStream(socket.getInputStream());
int c = is.read();

这读取一个字节,带有缓冲。

Reader reader = new InputStreamReader(socket.getInputStream();
int c = reader.read();

这读取一个字符,有一点缓冲:没有BufferedReader 提供的那么多。

出于@StephenC 所述的效率原因,现实的选择是在两个缓冲版本之间,并且它们之间的选择取决于您想要字节还是字符。

【讨论】:

    【解决方案2】:

    缓冲方法更好,因为(在大多数情况下)减少了 JVM 需要对操作系统进行的系统调用的数量。由于系统调用相对昂贵,缓冲通常可以为您提供更好的性能。


    在您的具体示例中:

    • 每次在输入流上调用 c.read() 时,都会执行一次系统调用。
    • 第一次对缓冲的输入流执行c.read()(或其他读取操作)时,它会将多个字节读取到内存中的字节数组中。在对c.read() 的第二次、第三次等调用中,读取通常会从内存缓冲区中返回一个字节,而无需进行系统调用。

    在您的示例中,使用缓冲流无济于事的唯一情况是您打算从套接字中仅读取一个字节,然后将其关闭。


    更新

    我没有注意到您将无缓冲的 InputStream 与缓冲的 >> Reader 进行比较

    (如果您不理解 那个 区别...以及为什么它是一个重要区别...建议您阅读 Java 教程课程在Basic I/O。特别是字节流、字符流和缓冲流的部分。)

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多