Чтение и запись бинарных файлов

Последнее обновление: 12.04.2023

Класс 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> в нужный нам объект.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850