35

我想优化这段代码:

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

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

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

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

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

4

6 回答 6

84

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

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

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

String text = builder.toString();
于 2011-01-12T08:46:50.973 回答
26

您可以尝试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();
于 2011-01-12T08:57:00.877 回答
7

BufferedReaderSocket 读取时,需要添加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();
于 2014-10-18T15:23:36.490 回答
1

一线解决方案:

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

进口:

import java.io.*;
import static java.lang.System.lineSeparator;
import static java.util.stream.Collectors.joining;
于 2018-12-24T20:12:31.320 回答
0

我编写了一个简单的函数来使用 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();
}
于 2017-07-07T21:23:30.147 回答
-1

您可以使用字符串缓冲区

while ((aux = reader.readLine()) != null) {
     stringBuffer.append(aux);
}
于 2011-01-12T08:55:13.763 回答