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中Sockets长连接时使用read()阻塞的问题!急救!
读Java性能权威指南(第2版)笔记03_ Java SE API技巧中