Ce face IOSink.close
close() trimite toate datele rămase în coadă, închide fișierul (sau conexiunea) și returnează un Future care se termină când totul este gata. După close nu mai poți scrie. Fără close, ultimele date pot să nu ajungă niciodată pe disc.
flush() așteaptă ca datele scrise până acum să fie trimise, dar lasă sink-ul deschis pentru alte scrieri. Este util când un alt cod trebuie să citească fișierul în timp ce tu continui să scrii. Cât timp un flush nu s-a terminat, nu ai voie să scrii în sink (se aruncă StateError); de aceea îl aștepți mereu cu await.
Getter-ul done este un Future care se termină când sink-ul s-a închis (sau cu eroarea de scriere).
Ce returnează
Un Future care se termină după trimiterea datelor.
Exemple
Exemplul 1: flush în timpul scrierii, close la final
import 'dart:io';
Future<void> main() async {
final f = File('progres.txt');
final sink = f.openWrite();
for (var pas = 1; pas <= 3; pas++) {
sink.writeln('pasul $pas terminat');
await sink.flush();
print('După flush: ${await f.length()} octeți pe disc');
}
await sink.close();
print(await f.readAsLines());
}
Rezultat
După flush: 17 octeți pe disc
După flush: 34 octeți pe disc
După flush: 51 octeți pe disc
[pasul 1 terminat, pasul 2 terminat, pasul 3 terminat]
Exemplul 2: close în finally, chiar dacă apare o eroare
import 'dart:io';
Future<void> exporta(List<int> note) async {
final sink = File('note.txt').openWrite();
try {
for (final n in note) {
if (n < 1 || n > 10) throw ArgumentError('notă invalidă: $n');
sink.writeln(n);
}
} finally {
await sink.close();
}
}
Future<void> main() async {
try {
await exporta([9, 10, 42, 7]);
} on ArgumentError catch (eroare) {
print(eroare.message);
}
print('Salvat până la eroare: ${await File('note.txt').readAsLines()}');
}
Rezultat
notă invalidă: 42
Salvat până la eroare: [9, 10]
Greșeli frecvente
- Apelezi
sink.close()fărăawaitși citești imediat fișierul: datele pot să nu fie încă scrise. - Pui
flush()după fiecare rând fără motiv: încetinește mult scrierea.close()trimite oricum tot.
Comenzi înrudite
IOSink: Destinația în care scrii text sau octeți: un fișier deschis (openWrite), stdout, stderr sau răspunsul HTTP.File.openWrite: Deschide fișierul pentru scriere și returnează un IOSink în care scrii pe bucăți; trebuie închis cu close().stdout: stdout este ieșirea standard a programului: tot ce apare în terminal; are metodele unui IOSink (write, writeln, writeAll).