【问题标题】:How to read BufferedReader faster如何更快地阅读 BufferedReader
【发布时间】: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 表示“我需要花尽可能少的时间”。我认为这意味着它需要尽可能高效,但我将其解读为“我希望做尽可能少的工作以达到最佳结果。”

标签: java optimization bufferedreader


【解决方案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();

【讨论】:

【解决方案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
        猜你喜欢
        • 2012-09-29
        • 2022-08-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2021-04-02
        • 2018-11-15
        • 2019-12-16
        • 2012-05-04
        相关资源
        最近更新 更多