Java 从TCP服务器读取字节的方法之间的差异?

Java 从TCP服务器读取字节的方法之间的差异?,java,android,tcpclient,Java,Android,Tcpclient,我正在尝试使用TCP协议读取android上为客户端发送的信息。在我的服务器中,我有以下代码: InputStream input = clienteSocket.getInputStream(); int c = input.read(); c将包含客户端发送的ascci号 我也可以通过以下方式获得: BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 我想知道这两种

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

InputStream input = clienteSocket.getInputStream();
int c = input.read();
c将包含客户端发送的ascci号

我也可以通过以下方式获得:

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

我想知道这两种方法之间的区别。

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


在您的具体示例中:

  • 每次对输入流调用
    c.read()
    ,都会执行一个系统调用
  • 第一次对缓冲输入流执行
    c.read()
    (或其他读取操作)时,它会将大量字节读入内存中的字节数组。在对
    c.read()
    的第二次、第三次etc调用中,读取通常会从内存缓冲区中返回一个字节,而不进行系统调用
在您的示例中,使用缓冲流没有帮助的唯一情况是,您只从套接字读取一个字节,然后关闭它


更新


我没有注意到您正在比较未缓冲的
输入流
和缓冲的>>
读取器
您正在比较苹果和桔子

  • 第一个示例从流中读取一个未缓冲的字节,并返回该字节的值。(将“ASCII编号”添加到该字段不会添加任何实际信息。)
  • 您的第二个示例设置了一个缓冲读取器,它可以从缓冲流中读取字符,但实际上不读取任何内容
您可以再举两个例子:

InputStream is = new BufferedInputStream(socket.getInputStream());
int c = is.read();
这将读取一个字节,带有缓冲

Reader reader = new InputStreamReader(socket.getInputStream();
int c = reader.read();
这将读取一个带有少量缓冲的字符:没有
BufferedReader
提供的那么多

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

您只需要客户端的一个(单个)字节还是流中的所有内容?(a)定义“最佳”。(b) 你知道一个给你一个字节,另一个给你一个字符吗?(c) 你把“来自客户端”和“来自服务器”混为一谈,并不是说这有一点区别。