我试图使用协议TCP读取在android上发送给客户端的信息。 在我的服务器中,我有下一个代码:
InputStream input = clienteSocket.getInputStream();
int c = input.read();
c将包含客户端发送的ascci号码。
我也可以通过编写下一个代码来获得这个:
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
我想知道两种方法之间有什么区别。
答案 0 :(得分:1)
缓冲方法更好,因为(在大多数情况下)减少了JVM需要对操作系统进行的系统调用。由于系统调用相对较贵,缓冲通常可以提供更好的性能。
在您的具体示例中:
c.read()
时,都会进行系统调用。c.read()
(或其他读取操作)时,它会将一些字节读入内存中的字节数组。在对c.read()
的第二次,第三次等调用中,读取通常会从内存缓冲区返回一个字节,而不进行系统调用。在您的示例中,使用缓冲流的唯一情况是,如果您只从套接字中读取一个字节,然后将其关闭。
<强>更新强>
我没有注意到您将未缓冲的InputStream
与缓冲的&gt;&gt;进行比较Reader
&lt;&lt;。正如@EJP指出的那样,这是“比较苹果和橘子”。两个版本的功能是不同的。一个重命名字节,另一个读取字符。
(如果您不理解 区别......以及为什么它是重要区别......建议您阅读Java Tutorial课程on Basic I/O。特别是关于字节流,字符流和缓冲流的部分。)
答案 1 :(得分:0)
你在这里比较苹果和橘子。
您可以设置另外两个示例:
Reader reader = new InputStreamReader(socket.getInputStream();
int c = reader.read();
这会读取一个字节,并进行缓冲。
BufferedReader
这会读取一个char,只需要一点缓冲:不如{{1}}提供的那么多。
两个缓冲版本之间的现实选择,出于效率原因,如@StephenC所述,它们之间的选择取决于您是否需要字节或字符。