如何更快地阅读 BufferedReader

Posted

技术标签:

【中文标题】如何更快地阅读 BufferedReader【英文标题】:How to read BufferedReader faster 【发布时间】:2011-06-07 16:40:23 【问题描述】:

我要优化这段代码:

InputStream is = rp.getEntity().getContent();      

BufferedReader reader = new BufferedReader(new InputStreamReader(is));

String text = "";
String aux = "";

while ((aux = reader.readLine()) != null) 
        text += aux;
      

问题是我不知道如何读取 bufferedreader 的内容并将其复制到 String 中,速度比我上面的要快。 我需要花尽可能少的时间。 谢谢

【问题讨论】:

您可以使用 StringBuilder 作为初学者。它将避免字符串的连接。您也可以对大型 char 数组使用 read 方法,但要获得最佳数组大小将需要一些基准测试。 你确定不用放回readLine()取出的换行码吗? LOL 表示“我需要花尽可能少的时间”。我认为这意味着它需要尽可能高效,但我将其解读为“我希望做尽可能少的工作以达到最佳结果。” 另见:***.com/questions/2980805/… 【参考方案1】:

在循环中使用字符串连接是经典的性能杀手(因为字符串是不可变的,所以每次连接都会复制整个越来越大的字符串)。改为这样做:

StringBuilder builder = new StringBuilder();
String aux = "";

while ((aux = reader.readLine()) != null) 
    builder.append(aux);


String text = builder.toString();

【讨论】:

假设 java 1.5 或更高版本。否则,您将使用 StringBuffer。 值得指出的是 readLine 使用换行符。这个循环不会很有用,除非你想把所有的文本变成一行(在换行符的地方没有分隔符) @Greg:甚至 Java 5 在一年多前就超过了 EOSL 日期。是时候停止在涉及更旧版本的问题上浪费脑力了。 @Greg:我是说这是一个假设,在这个时代,每个人都应该毫不犹豫地做出,除非有明确的信息与之相矛盾。 鉴于 Java 1.5 已停止支持,Java 1.6 已停止使用,因此可以安全地假设您的编译器是 Java 1.6 或 1.7(可能是 1.5),但不太可能是 1.4 或事先的。我会说使用 StringBuilder 非常安全。【参考方案2】:

你可以试试Apache IOUtils.toString。他们就是这样做的:

StringWriter sw = new StringWriter();
char[] buffer = new char[1024 * 4];
int n = 0;
while (-1 != (n = input.read(buffer))) 
    sw.write(buffer, 0, n);

String text = sw.toString();

【讨论】:

需要更多的支持,可能比逐行阅读要好,尤其是在行很短的情况下。见***.com/questions/2980805/…【参考方案3】:

BufferedReader从Socket读取时,需要加上bufferedReader.ready()

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

StringBuilder sb= new StringBuilder();
String line = "";

while (br.ready() && (line = br.readLine()) != null) 
    sb.append(line + "\r\n");


String result = sb.toString();

【讨论】:

【参考方案4】:

一条线解决方案:

String result = reader.lines().collect(joining(lineSeparator()));

进口:

import java.io.*;
import static java.lang.System.lineSeparator;
import static java.util.stream.Collectors.joining;

【讨论】:

【参考方案5】:

我使用 StringBuilder 和 While 循环编写了一个简单的函数来执行此操作,并在其中捕获 IOException。

public String getString(BufferedReader bufferedReader) 
    StringBuilder stringBuilder = new StringBuilder();
    String line = null;

    do 
        try 
            if ((line = bufferedReader.readLine()) != null) 
                stringBuilder.append(line).append(System.lineSeparator());
            
         catch (IOException e) 
            e.printStackTrace();
        
     while (line != null);

    return stringBuilder.toString();

【讨论】:

【参考方案6】:

您可以使用StringBuffer

while ((aux = reader.readLine()) != null) 
     stringBuffer.append(aux);

【讨论】:

@dogbane StringBuffer 在需要同步时不是更好吗? @735Tesla 看到这个link

以上是关于如何更快地阅读 BufferedReader的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spark scala 中更快地处理 .gz 文件?

如何在 selenium 中更快地从动态网站读取数据

在 R 中更快地读取 SQL 表

PHP 如何更快地执行这些检查/或更快地加载页面?

如何更快地加载 MKMapView?

如何更快地进行三重 foreach?