Dart openRead
Im letzten Post haben wir uns angesehen, wie man ganze Zeichenketten aus einem File liest und schreibt. In diesem Post geht es um eine flexiblere Methode, welche uns der Einsatz von Streams zur Verfügung stellt. Insbesondere die Möglichkeit ganz genau festzulegen, wie viel man aus der Datei auslesen möchte und ab welcher Stelle, macht openRead interessant.
Hier ein nur minimal abgeändertes Beispiel aus der original Dokumentation:
Als erstes fällt .transform auf. Wir haben zu Beginn einen Stream geöffnet und lesen Daten aus dem File ein. Man kann sich diese eintreffenden Daten als einen Strom vorstellen, auf welchen mit .transform eine Manipulation vorgenommen wird. Die erste Veränderung an den Daten erfolgt überopenRead
Hier ein nur minimal abgeändertes Beispiel aus der original Dokumentation:
über den utf8.decoder. Er wandelt die eintreffenden Daten in Zeichen (Strings) um.
Das nächste .transform implementiert den LineSplitter().
Diese Funktion unterteilt den Datenstrom, der durch den utf8.decoder zu einem String Strom wurde, in Zeilen.Das Ende einer Zeile wird durch spezielle Codes festgelegt, die sich über die Jahre durchgesetzt haben. CR, bzw der Code dafür ist zum Beispiel einer davon, Carriage return, oder deutsch Wagenrücklauf.
Hatten wir am Anfang einen Strom an Byte Daten, haben wir nach zwei .transform Operationen am Stream einen Strom an eintreffenden Zeilen.
Als letztes "abonnieren" wir den Stream mit .listen. .listen können wir eine benutzerdefinierte Funktion übergeben, die die eintreffenden Zeilen weiterverarbeitet. In diesem Fall eine simple print Funktion, die in die Konsole schreibt.
Besonderes
openRead können auch start und end Positionen übergeben werden.
openRead(10,50);
Mit dieser Variante lesen wir von Byte 10 bis 50. Beide Werte sind vom Typ int. Was die eintreffenden Zeilen angeht, gibt Dart die Codes für das Zeilenende nicht mit zurück. Das die Strings in der Konsole Zeile für Zeile gedruckt werden, ist der print Funktion geschuldet.
Die utf8 Dekodierung ist nicht die einzige die zur Verfügung steht, allgemein gibt es noch weitere Möglichkeiten was .transform angeht. Die dart:convert Library ist hier die richtige Quelle für weitere Infos.
Kommentare
Kommentar veröffentlichen