web-dev-qa-db-fra.com

Comment lire BufferedReader plus rapidement

Je veux optimiser ce code:

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

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

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

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

Le fait est que je ne sais pas comment lire le contenu de bufferedreader et le copier dans une chaîne plus rapide que ce que j'ai ci-dessus… .. Je dois passer le moins de temps possible… .. Merci

32
Cata

Utiliser la concaténation de chaînes dans une boucle est le tueur de performances classique (les chaînes étant immuables, la chaîne entière, de plus en plus grande, est copiée pour chaque concaténation). Faites ceci à la place:

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

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

String text = builder.toString();
82
Michael Borgwardt

Vous pouvez essayer Apache IOUtils.toString . Voilà ce qu'ils font:

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();
25
dogbane

Lorsque BufferedReader lit depuis Socket, il est nécessaire d’ajouter 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();
6
michalv

Une solution en ligne: 

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()));
1
Hykilpikonna

J'ai écrit une fonction simple pour faire cela en utilisant StringBuilder et la boucle While avec capture de IOException à l'intérieur.

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
Thach Van