我们正在努力减少延迟并提高用 Java 编写的进程的性能,该进程通过 readLine() 方法从套接字消费数据(xml 字符串)。缓冲读取器 http://java.sun.com/javase/6/docs/api/java/io/BufferedReader.html班级。数据由行分隔符末尾 (\n) 分隔,每行可以具有可变长度 (6KBits - 32KBits)。我们的代码如下所示:
Socket sock = connection;
InputStream in = sock.getInputStream();
BufferedReader inputReader = new BufferedReader(new InputStreamReader(in));
...
do
{
String input = inputReader.readLine();
// Executor call to parse the input thread in a seperate thread
}while(true)
所以我有几个问题:
- inputReader.readLine() 方法会在遇到 \n 字符时立即返回还是会等到缓冲区已满?
- 有没有更快的获取数据的方法
从插座比使用
缓冲阅读器?
- 当输入字符串的大小小于 Socket 接收缓冲区的大小时会发生什么?
- 当大小
输入字符串大于大小
Socket 的接收缓冲区?
我正在(慢慢地)掌握 Java 的 IO 库,因此非常感谢任何指点。
谢谢你!
inputReader.readLine() 方法会在遇到 \n 字符时立即返回还是会等到缓冲区已满?
从套接字获取数据是否比使用 BufferedReader 更快?
-
BufferedReader 需要对数据进行一些复制。您可以尝试 NIO api,它可以避免复制,但您可能需要在花时间进行分析之前先进行分析,看看 I/O 是否确实是瓶颈。一个更简单的快速修复是添加一个BufferedInputStream
围绕套接字,以便每次读取都不会命中套接字(尚不清楚 InputStreamReader 本身是否进行任何缓冲。)
新的BufferedReader(新的InputStreamReader(新的BufferedInputStream(in)))
当输入字符串的大小小于 Socket 接收缓冲区的大小时会发生什么?
- BufferedReader 将获取所有可用数据。然后它将扫描该数据以查找换行符。结果是后续读取可能已经拥有 BufferedReader 中的数据。
当输入字符串的大小大于 Socket 接收缓冲区的大小时会发生什么?
- bufferedReader 将读取接收缓冲区中的内容,并且由于没有换行符或到达流末尾,它将继续从套接字读取数据,直到找到 EOF 或换行符。后续读取可能会阻塞,直到有更多数据可用。
总而言之,BufferedReader 仅在绝对必要时才会阻塞。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)