Ich habe einige Zeittests durchgeführt, denn Zeit ist immer wichtig.
Ich habe auf 3 verschiedene Arten versucht, die Antwort in einen String zu übertragen. (siehe unten)
Ich habe try/catch-Blöcke der Lesbarkeit halber weggelassen.
Um den Zusammenhang zu verdeutlichen, ist dies der vorangehende Code für alle 3 Ansätze:
String response;
String url = "www.blah.com/path?key=value";
GetMethod method = new GetMethod(url);
int status = client.executeMethod(method);
1)
response = method.getResponseBodyAsString();
2)
InputStream resp = method.getResponseBodyAsStream();
InputStreamReader is=new InputStreamReader(resp);
BufferedReader br=new BufferedReader(is);
String read = null;
StringBuffer sb = new StringBuffer();
while((read = br.readLine()) != null) {
sb.append(read);
}
response = sb.toString();
3)
InputStream iStream = method.getResponseBodyAsStream();
StringWriter writer = new StringWriter();
IOUtils.copy(iStream, writer, "UTF-8");
response = writer.toString();
Nachdem ich also 500 Tests für jeden Ansatz mit denselben Anfrage-/Antwortdaten durchgeführt habe, sind hier die Zahlen. Noch einmal: Dies sind meine Ergebnisse, und Ihre Ergebnisse sind vielleicht nicht genau dieselben, aber ich habe dies geschrieben, um anderen einen Hinweis auf die Effizienzunterschiede dieser Ansätze zu geben.
Ränge:
Ansatz 1
Ansatz #3 - 2,6% langsamer als #1
Ansatz #2 - 4,3% langsamer als #1
Jeder dieser Ansätze ist eine geeignete Lösung, um eine Antwort zu erfassen und daraus einen String zu erstellen.
0 Stimmen
Ist damit Ihre Frage beantwortet? Der Scanner überspringt nextLine() nach der Verwendung von next() oder nextFoo()?
2 Stimmen
Denken Sie daran, dass Sie die Kodierung des Eingangsstroms berücksichtigen müssen. Die Systemvorgabe ist nicht unbedingt immer die, die Sie wollen.
23 Stimmen
Die meisten dieser Antworten wurden vor Java 9 geschrieben, aber jetzt kann man mit .readAllBytes ein Byte-Array aus dem InputStream holen. Also, einfach "new String(inputStream.readAllBytes())" funktioniert mit dem byte[] Konstruktor von String.