Java 套接字:InputStream.read() 与 BufferedReader.read()

Posted

技术标签:

【中文标题】Java 套接字:InputStream.read() 与 BufferedReader.read()【英文标题】:Java-Sockets: InputStream.read() vs BufferedReader.read() 【发布时间】:2010-12-05 18:08:18 【问题描述】:

我正在从 Socket 的 InputStream 中读取数据。因为我正在动态解析传入的数据,所以我需要逐个字符地读取。

BufferedReader.read()InputStream.read() 做的事情一样吗? (假设 BufferedReader 是以 InputStream 为基础构建的)

分别读取每个字符时使用 InputStream.read() 效率更高吗?或者有没有更好的办法?

【问题讨论】:

【参考方案1】:

BufferedReader 将从底层 Reader 读取多个字符。 InputStream 提供字节。所以他们正在研究两种不同的数据类型。您如何将 Reader 包裹在 Stream 周围?大概你已经做了类似的事情:

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

在这种情况下,我会小心指定您的字符编码。

从优化的角度来看,使用 BufferedReader 会更好,因为它会一次读取几千字节,并且您可以在需要时获取每个字符(不一定强制读取新的 IO)。

【讨论】:

谢谢。那么你建议我使用 InputStream 吗?我正在阅读流,直到出现一些特殊字符。然后我解析那块并等待下一个“包”。有没有更好的方法来做到这一点? 请注意,流会给你字节。阅读器会给你字符。因此,您需要更清楚地了解收到的内容和需要的内容。【参考方案2】:

InputStream 类的read() 方法是一个抽象方法。我猜应该是 InputStreamrReader。回到你的问题,InputStreamReader 和 BufferesReader 类的 read() 方法都做同样的事情——返回字符的 ascii 值,唯一的区别是 BufferedReader 使用所谓的缓冲,它允许我们减少读取的频率通过将块复制到主内存来访问磁盘/STDIN,其中使用 InputStreamReader 每次调用 read() 都可能导致从磁盘/STDIN 读取字节,转换为字符,然后返回,这可能非常低效。

【讨论】:

以上是关于Java 套接字:InputStream.read() 与 BufferedReader.read()的主要内容,如果未能解决你的问题,请参考以下文章

java InputStream读取数据问题

Java InputStream 阻塞读取

JAVA中Sockets长连接时使用read()阻塞的问题!急救!

读Java性能权威指南(第2版)笔记03_ Java SE API技巧中

Java中InputStream和String之间的转换方法

java教程——InputStream(经典蓝牙实战)