Ich studiere Android Entwicklung (ich ein Anfänger in der Programmierung im Allgemeinen bin) und das Lernen über HTTP Vernetzung und sah diesen Code in der Lektion:Wie funktionieren InputStream, InputStreamReader und BufferedReader in Java zusammen?
private String readFromStream(InputStream inputStream) throws IOException {
StringBuilder output = new StringBuilder();
if (inputStream != null) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
while (line != null) {
output.append(line);
line = reader.readLine();
}
}
return output.toString();
}
Ich verstehe nicht genau das, was INPUTSTREAM- Input und BufferedReader machen. Alle haben eine read() Methode und auch readLine() im Falle des BufferedReaders.Warum kann ich nicht nur den InputStream benutzen oder nur den InputStreamReader hinzufügen? Warum muss ich den BufferedReader hinzufügen? Ich weiß, dass es mit Effizienz zu tun hat, aber ich verstehe nicht wie.
Ich habe untersucht, und die documentation for the BufferedReader versucht, dies zu erklären, aber ich immer noch nicht, wer was tut:
Im Allgemeinen las jede Anforderung eines Reader eine entsprechende Leseanforderung verursacht aus dem zugrunde liegenden Zeichen oder Bytestrom gemacht werden. Es ist daher empfehlenswert, einen BufferedReader um jeden Reader zu wickeln, dessen read() - Operationen kostspielig sein können, wie FileReaders und InputStreamReaders. Beispiel:
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
puffert die Eingabe aus der angegebenen Datei. Ohne Pufferung könnte jeder Aufruf von read() oder readLine() dazu führen, dass Bytes aus der Datei gelesen, in Zeichen konvertiert und dann zurückgegeben werden. Dies kann sehr ineffizient sein.
Also, ich verstehe, dass die Input nur ein Byte lesen, die Input ein einzelnes Zeichen, und die BufferedReader eine ganze Linie und dass es auch etwas über Effizienz tut das, was ich nicht bekommen. Ich hätte gerne ein besseres Verständnis davon, wer was macht, um zu verstehen, warum ich alle drei brauche und was der Unterschied ohne einen von ihnen wäre.
Ich habe viel hier und anderswo im Web recherchiert und finde keine Erklärung dafür, die ich verstehen kann, fast alle Tutorials wiederholen einfach die Dokumentationsinfos. Hier sind einige verwandte Fragen, die vielleicht beginnen, dies zu erklären, aber gehen Sie nicht tiefer und lösen Sie meine Verwirrung: Q1, Q2, Q3, Q4. Ich denke, es könnte mit der Erklärung dieser letzten Frage über Systemaufrufe und die Rückkehr zu tun haben. Aber ich möchte verstehen, was damit gemeint ist.
Könnte es sein, dass die readLine() des BufferedReaders die read() -Methode des InputStreamReader aufruft, die wiederum die read() -Methode des InputStream aufruft? Und der InputStream gibt Bytes zurück, die in int konvertiert wurden, wobei ein einzelnes Byte nach dem anderen zurückgegeben wird. Der InputStreamReader liest genug von diesen Zeichen, um ein einzelnes Zeichen zu erzeugen, konvertiert es in int und gibt jeweils ein einzelnes Zeichen zurück, und der BufferedReader liest genügend dieser Zeichen als ganze Zahlen dargestellt, um eine ganze Zeile zu bilden? Und gibt die ganze Zeile als String zurück und kehrt nur einmal statt mehrmals zurück? Ich weiß nicht, ich versuche nur zu verstehen, wie die Dinge funktionieren.
Vielen Dank im Voraus!
http://stackoverflow.com/questions/32175221/what-is-the-relation-between-inputstream-bufferedinputstream-inputstreamreade?rq=1? –
Danke für den Vorschlag @RC. Ich hatte diese Frage bereits gesehen und sie in meiner eigenen Frage erwähnt. Ich suche nach etwas genauerem, was zwischen den dreien passiert. – schv09