Java:BufferedReader的readLine方法的效率和可能的替代方案

Luh*_*har 12 java sockets io

我们正在努力减少延迟并提高用Java编写的进程的性能,该进程通过BufferedReader类的readLine()方法从套接字使用数据(xml字符串).数据由行结束分隔符(\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)
Run Code Online (Sandbox Code Playgroud)

所以我有几个问题:

  • inputReader.readLine()方法一旦命中\n字符就会返回,还是等到缓冲区满了?
  • 从使用BufferedReader获取套接字数据的速度是否更快?
  • 当输入字符串的大小小于Socket接收缓冲区的大小时会发生什么?
  • 当输入字符串的大小大于Socket接收缓冲区的大小时会发生什么?

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

谢谢!

mdm*_*dma 15

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

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

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

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

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

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

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

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

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

总而言之,BufferedReader仅在绝对必要时才会阻塞.