IOSink.close în Dart

close termină scrierea și închide destinația; flush așteaptă ca datele scrise până acum să ajungă la destinație.

Sintaxă
Future close()
Future flush()
Future get done

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).