Как читать BufferedReader быстрее - PullRequest
32 голосов
/ 12 января 2011

Я хочу оптимизировать этот код:

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

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

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

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

Дело в том, что я не знаю, как читать содержимое буферизированного читателя и копировать его в строку быстрее, чем у меня выше. Мне нужно провести как можно меньше времени. Спасибо

Ответы [ 6 ]

82 голосов
/ 12 января 2011

Использование конкатенации строк в цикле - это классический убийца производительности (поскольку строки неизменяемы, для каждой конкатенации копируется вся все более крупная строка).Сделайте это вместо:

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

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

String text = builder.toString();
25 голосов
/ 12 января 2011

Вы можете попробовать 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();
6 голосов
/ 18 октября 2014

Когда 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();
1 голос
/ 24 декабря 2018

Однолинейное решение:

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

BufferedReader reader = ...;
String result = reader.lines().collect(joining(lineSeparator()));
0 голосов
/ 08 июля 2017

Я написал простую функцию, чтобы сделать это, используя цикл 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();
}
0 голосов
/ 12 января 2011

Вы можете использовать StringBuffer

while ((aux = reader.readLine()) != null) {
     stringBuffer.append(aux);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...