Класс File предоставляет ряд методов для чтения и записи бинарных файлов.
Для записи в бинарный файл набора байтов в асинхронном режиме применяется метод writeAsBytes()
writeAsBytes(List<int> bytes, {FileMode mode = FileMode.write, bool flush = false}) -> Future<File>
Результатом метода является объект Future, который содержит записанный файл. Метод принимает следующие параметры:
bytes
: записываемый набор байтов в виде списка List<int>
mode
: режим файла в виде объекта FileMode
flush
: логическое значение. Если оно равно true
, то записываемые данные будут автоматичеcки сбрасываться из буфера в файл перед
завершением работы метода.
Метод writeAsBytesSync работает аналогичным образом и примнимает те же параметры, только выполняется в синхронном режиме и ничего не возвращает:
writeAsBytesSync(List<int> bytes, {FileMode mode = FileMode.write, bool flush = false}) -> void
Например, запишем в бинарный файл некоторое содержимое:
import 'dart:io'; import 'dart:convert'; // для типа utf8 void main () async{ String message = "Hello METANIT.COM"; final file = File("content.bin"); // конвертируем строку в набор байтов List<int> bytes = utf8.encode(message); await file.writeAsBytes(bytes); print("File has been written"); }
Для примера в файл записывается некоторая строка. Перед записью она преобразуется в список байтов List<int> с помощью функции utf8.encode()
(для этого импортируем
пакет dart:convert):
List<int> bytes = utf8.encode(message);
Для чтения бинарных файлов в асинхронном режиме применяется метод readAsBytes(), который возвращает список байтов в виде объекта
Uint8List (по сути тот же List<int>
):
Future<Uint8List> readAsBytes();
Для синхронного чтения применяется метод readAsBytesSync()
Uint8List readAsBytesSync();
Например, считаем данные из выше записанного файла "content.bin":
import 'dart:io'; import 'dart:convert'; // для типа utf8 void main () async{ final file = File("content.bin"); List<int> content = await file.readAsBytes(); // конвертируем из набора байтов в строку String message = utf8.decode(content); print(message); }
Поскольку вы предыдущем примере при зависи в файл "content.bin" мы конвертировали строку в набор байтов, то здесь, наоборот, после считывания из файла байт конвертируем их
обратно в строку с помошью функции utf8.decode()
String message = utf8.decode(content);
Таким образом, если у нас есть какие-то сложные данные, которые мы хотим записать в бинарный файл, то сначала их надо конвертировать в набор байт List<int>. Соответственно при считывании производится обратная конвертация - из набора байт List<int> в нужный нам объект.