Java Streams Erklärung InputStream?
Kann mir jemand erklären, was hier passiert?
Ich verstehe die Zeilen 11 bis 15 so.
Zeile 11: Ich legen eine Referenzvariable der Klasse FileInputStream fis an.
Diese bekommt eine .txt Datei übergeben. D. h. der Stream soll diese Text-Datei einlesen.
Zeile12: Warum erzeugt man jetzt nochmal einen StreamReader isr der den FileInputStream fis erfasst? Weil der InputStreamReader mehr Methoden zur verfügung stellt?
=> Unterschied InputStreamReader zu FileInputStream?
Zeile 13: Dann wird ein BufferedReader br erzeugt wo isr als Parameter eingelesen wird
=> Was ist ein BufferedReader? Unterschied InputStreamReader zu BufferedReader?
Zeile 15: String line = br.readLine();
Hier wird der Inhalt des br in den String eingelesen.
=> Wird hier der ganze Inhalt von br eingelesen?
2 Antworten
Vorab: das ist eine Anwendung des Decorator-Patterns, das in java.io recht viel einsetzt wird.
Jede dieser Klassen stöpselt in eine andere (aber mit demselben Interface) und kann dann zusätzliche Dinge: schau dir die API-Dokumentation an. Beispielsweise kann nur ein BufferedReader zeilenweise lesen, mit der readLine()-Methode. Aber er muss nicht wissen, ob die Daten aus einer Datei oder vom Netzwerk kommen.
Der Code illustriert das Prinzip ganz gut, würde aber in produktiver Software so nicht verwendet werden, wenn man einfach eine Datei zeilenweise lesen will. Dafür gibt es viel bequemere Methoden (siehe Klasse Files).
Habe kurz in die Doku geschaut und verstehe es so:
FileInputStream: Liest Bytes aus einer Datei.
InputStreamReader: Wandelt die Bytes in Textzeichen um. Kann aber nur ein Byte nach dem anderen auslesen.
BufferedReader: Liest mehrere Bytes auf einmal und speichert sie in einem Zwischenspeicher. Das ist effizienter.
Der bequemste Weg sind immer noch die diversen statischen Methoden in File, etwa readLines() oder lines().
"Habe kurz in die Doku geschaut"
Welche Doku meinst du hier? Link bitte.
Übrigens gibt es einen bequemeren Weg eine Textdatei einzulesen und zwar mit der Klasse Scanner. Diese ist zwar nicht so schnell wie ein BufferedReader, aber oft spielt das keine Rolle: