Java:BufferedReader的readLine方法的效率和可能的替代方案 [英] Java: Efficiency of the readLine method of the BufferedReader and possible alternatives

查看:2545
本文介绍了Java:BufferedReader的readLine方法的效率和可能的替代方案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在努力减少延迟并提高用Java编写的进程的性能,该进程通过 BufferedReader 类。数据由行结束分隔符(\ n)分隔,每行可以是可变长度(6KBits - 32KBits)。我们的代码如下:

We are working to reduce the latency and increase the performance of a process written in Java that consumes data (xml strings) from a socket via the readLine() method of the BufferedReader class. The data is delimited by the end of line separater (\n), and each line can be of a variable length (6KBits - 32KBits). Our code looks like:

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字符还是等到缓冲区已满?

  • 从套接字中获取数据
    的速度是否比使用
    BufferedReader更快? / li>
  • 当输入字符串的大小小于Socket接收缓冲区的大小时会发生什么?


  • 输入字符串的大小大于Socket接收缓冲区的大小
    时会发生什么?

我正在努力(慢慢地)使用Java的IO库,所以任何指针都非常受欢迎。

I am getting to grips (slowly) with Java's IO libraries, so any pointers are much appreciated.

谢谢!

推荐答案

inputReader.readLine()方法一旦命中\ n字符就会返回,还是会返回等到缓冲区已满?


  • 它会在获得换行符后立即返回。

从套接字中获取数据的速度是否比使用BufferedReader更快?


  • BufferedReader需要复制一些数据。您可以尝试NIO apis,它可以避免复制,但您可能需要在花费任何时间进行分析之前查看它是否真的是I / O是瓶颈。一个更简单的快速修复是在套接字周围添加一个 BufferedInputStream ,这样每次读取都不会到达套接字(不清楚InputStreamReader是否自己进行任何缓冲。)例如

  • BufferedReader entails some copying of the data. You could try the NIO apis, which can avoid copying, but you might want to profile before spending any time on this to see if it really is the I/O that is the bottleneck. A simpler quick fix is to add a BufferedInputStream around the socket, so that each read is not hitting the socket (It's not clear if InputStreamReader does any buffering itself.) e.g.

new BufferedReader(new InputStreamReader(new BufferedInputStream(in)))

new BufferedReader(new InputStreamReader(new BufferedInputStream(in)))

当输入字符串的大小小于Socket接收缓冲区的大小时会发生什么?


  • BufferedReader将获取所有可用数据。然后它将扫描此数据以查找换行符。结果是后续读取可能已经拥有BufferedReader中的数据。

当输入字符串的大小时会发生什么是否大于Socket接收缓冲区的大小?


  • bufferedReader将读取接收缓冲区中的内容,并且如果没有换行符或流的末尾,它将继续从套接字读取数据,直到找到EOF或换行符。后续读取可能会阻塞,直到有更多数据可用。

总之,BufferedReader仅在绝对必要时阻止。

To sum up, BufferedReader blocks only when absolutely necessary.

这篇关于Java:BufferedReader的readLine方法的效率和可能的替代方案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆