哪个是从TCP SERVER读取字节的最佳方法?

时间:2015-10-04 00:30:46

标签: java android tcpclient

我试图使用协议TCP读取在android上发送给客户端的信息。 在我的服务器中,我有下一个代码:

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

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

我也可以通过编写下一个代码来获得这个:

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

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

2 个答案:

答案 0 :(得分:1)

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

在您的具体示例中:

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

在您的示例中,使用缓冲流的唯一情况是,如果您只从套接字中读取一个字节,然后将其关闭。

<强>更新

我没有注意到您将未缓冲的InputStream与缓冲的&gt;&gt;进行比较Reader&lt;&lt;。正如@EJP指出的那样,这是“比较苹果和橘子”。两个版本的功能是不同的。一个重命名字节,另一个读取字符。

(如果您不理解 区别......以及为什么它是重要区别......建议您阅读Java Tutorial课程on Basic I/O。特别是关于字节流,字符流和缓冲流的部分。)

答案 1 :(得分:0)

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

  • 您的第一个示例从流中读取一个字节,未缓冲,并返回该字节的值。 (添加“ASCII号码”不会增加实际信息。)
  • 你的第二个例子设置了一个缓冲的阅读器,可以从流中读取字符,缓冲,但实际上并没有读取任何内容。

您可以设置另外两个示例:

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

这会读取一个字节,并进行缓冲。

BufferedReader

这会读取一个char,只需要一点缓冲:不如{{1}}提供的那么多。

两个缓冲版本之间的现实选择,出于效率原因,如@StephenC所述,它们之间的选择取决于您是否需要字节或字符。