Как быстрее читать BufferedReader
Я хочу оптимизировать этот код:
InputStream is = rp.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String text = "";
String aux = "";
while ((aux = reader.readLine()) != null) {
text += aux;
}
Дело в том, что я не знаю, как читать содержимое буферизованного читателя и копировать его в String быстрее, чем то, что у меня выше.
Мне нужно потратить как можно меньше времени.
Спасибо вам
Ответы
Ответ 1
Использование конкатенации строк в цикле является классическим убийцей производительности (поскольку строки являются неизменяемыми, вся, все больше и больше String копируется для каждой конкатенации). Сделайте это вместо:
StringBuilder builder = new StringBuilder();
String aux = "";
while ((aux = reader.readLine()) != null) {
builder.append(aux);
}
String text = builder.toString();
Ответ 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
Я написал простую функцию для этого, используя StringBuilder и While loop с catch 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();
}
Ответ 5
Вы можете использовать StringBuffer
while ((aux = reader.readLine()) != null) {
stringBuffer.append(aux);
}