Dart -- readAsString und readAsLines


In diesem Blog habe ich in der Vergangenheit schon Posts über Dateioperation in Dart geschrieben. Aber um das Wissen aufzufrischen, ist es nie verkehrt sich das Thema noch einmal anzusehen.

Wichtig dabei sind die Begriffe synchron und asynchron. Nehmen wir an, wir schreiben eine Funktion und diese gibt ein Ergebnis zurück. Nur gibt sie dieses Ergebnis nicht sofort zurück, sondern wir wissen eigentlich nicht genau, wie lange es dauern wird, bis wir das Ergebnis erhalten. Beispiel: Wenn wir ein kleines File komplett einlesen, dürfte das schneller gehen, als bei einer sehr großen Datei.

Wenn wir darauf warten, bis das File komplett eingelesen ist, programmieren wir synchron.
Wir blockieren das Programm, bis die File-Operation abgeschlossen ist.

Wenn wir NICHT darauf warten, bis das File komplett eingelesen ist, programmieren wir asynchron. Die nächsten Befehle in unserem Code werden ausgeführt.

In diesem Kontext ist auch Future zu verstehen. Eine Variable die so deklariert wird, erhält ein asynchrones Objekt zugeteilt.

Für die Code Beispiele verwenden wir Visual Studio Code und ein Textfile, das sich im gleichen Ordner befindet, wie Ihre Dart Datei. Beispiel Code:


import 'dart:io';

File datei;
Future<String> inhalt;

void main(List<String> arguments) {
  datei = File('meinFile.txt'); // 1
  inhalt = datei.readAsString(); // 2
  inhalt.then((c) => print(c)); // 3
}

1. Wir benutzen die File Klasse von dart.io und erstellen das File Objekt datei.
2. Die Klassenmethode .readAsString(); wird auf das File Objekt angewandt. Das Ergebnis weisen wir der Future<String> Variable inhalt zu.
3. Bei dem Future Objekt inhalt verwenden wir die .then(...) Methode und drucken die Datei in das Terminal. Eine sogenannte Callback Methode.

Bitte beachten Sie, das die .then(...) Methode erst ausgeführt wird, wenn das Ergebnis von .readAsString(); vorliegt.

Im Beispiel Code oben wird das ganze File eingelesen. Das mag bei gewissen Dateien die Lösung sein. Was aber, wenn wir Zeile für Zeile aus einer Datei lesen möchten ?

.readAsLines(..)

Um das klarzustellen: .readAsLines(..) liest ebenfalls die komplette Datei ein. Der große Unterschied ist, das sie im Format einer Liste von Zeichenketten eingelesen wird. Dabei repräsentiert jeder Listeneintrag eine Linie der Datei. Ein Beispiel Code:


import 'dart:io';

File datei;
Future<List<String>> inhalt; // 1

LinienVerarbeiten(inhalt) {
  //2
  for (var linie in inhalt) {
    print(linie);
  }
}

void main(List<String> arguments) {
  datei = File('meinFile.txt'); 
  inhalt = datei.readAsLines().then((value) => LinienVerarbeiten(value)); //3
}

1. Hier wird eine Variable definiert vom Typ Future<List<String>> . Das sieht jetzt ein wenig kryptisch aus, ist aber einfach zu verstehen. Mit dem Schlüsselwort Future deklarieren Sie eine asynchrone Variable. Mit <List<String>> definieren Sie, das diese Variable eine Liste von Zeichenketten ist.
2. Die Linien dieser Datei werden durch eine eigene Funktion ausgedruckt, LinienVerarbeiten.
3. Diese eigene Funktion wird innerhalb der Callback Funktion von readAsLines(..), then(..), mit dem Ergebnis von readAsLines(..) aufgerufen.

Bis bald !

Kommentare

Beliebte Posts aus diesem Blog

Flutter und JSON

Flutter -- ohne Dart geht es nicht Klassen Teil 1

Listen in Dart (2021): Part 1 List.filled List.empty und List.add