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
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();
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();
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();
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()));
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();
}