ЧтениеДанных и ЗаписьДанных

Общая информация

Типы ПотокЧтения и ПотокЗаписи обеспечивают самый минимальный набор методов для работы с данными. В некоторых случаях необходимо получить более высокоуровневые механизмы работы с данными, например: прочитать или записать число, найти какой-либо маркер в данных и т. д. Для выполнения таких действий предназначены типы ЧтениеДанных и ЗаписьДанных. Рассмотрим эти типы более подробно.

Запись данных

Для записи данных предназначен тип ЗаписьДанных. Экземпляр этого типа создается конструктором, параметрами которого выступают поток, в который будут записываться данные, и настройки записи данных. Настройки записи данных задаются с помощью типа НастройкиЗаписиДанных, который позволяет управлять следующими настройками:
  • В какой кодировке будут записываться данные в данном потоке (если в приемник данных пишется текстовая информация). Задается текстовым идентификатором кодировки. Свойство Кодировка.
  • Позволяет указать, каким образом в приемник данных будет записываться метка порядка байтов (также известная как BOM — Byte Order Mark). Данная настройка учитывается только в том случае, если для потока устанавливается кодировка UTF-8, UTF-16 или UTF-32. Для остальных кодировок данная настройка игнорируется. Задается в свойстве НастройкиЗаписиДанных.МеткаПорядкаБайтов с помощью значения перечисления МеткаПорядкаБайтов.
  • Какой символ или их последовательность будет считаться разделителем строк (если в приемник данных пишется текстовая информация). Является строкой. Свойство РазделительСтрок.
  • Позволяет указать порядок следования байтов в словах: «младший-старший» (little endian) или «старший-младший» (big endian). Порядок следования байтов важен при записи многобайтовых данных (слов). Этот порядок может определяться архитектурой компьютера, на котором будут читаться данные, записываемые в поток, или этот порядок определяется самим форматом записываемых данных (например, форматом файла). Задается в свойстве НастройкиЗаписиДанных.ПорядокБайтов с помощью значения перечисления ПорядокБайтов.
Тип ЗаписьДанных позволяет выполнять следующие операции:
  • Записать один байт (число в интервале от 0 до 255 включительно). Используется метод ЗаписатьБайт().
  • Записать целое число. Поддерживаются 16-разрядные, 32-разрядные и 64-разрядные целые числа. При записи можно указать порядок байтов. Если порядок не указан, используется порядок байтов из настроек экземпляра ЗаписьДанных. Для записи чисел используются методы ЗаписатьЦелое16(), ЗаписатьЦелое32() и ЗаписатьЦелое64().
  • Записать несколько символов или строку символов. Используются методы ЗаписатьСимволы() и ЗаписатьСтроку(). Разница заключается в том, что метод ЗаписатьСтроку() после самой строки записывает в поток еще и разделитель строк. Если он не указан, то используется разделитель строк из настроек экземпляра ЗаписьДанных. Также оба метода позволяют задать кодировку записываемых данных. Если она не указана в методе, используется кодировка из настроек экземпляра ЗаписьДанных.
  • Записать в поток двоичные данные. Двоичные данные могут быть представлены типом Байты или экземпляром типа РезультатЧтенияДанных, который возвращается в результате вызова метода ЧтениеДанных.Прочитать() или ЧтениеДанных.ПрочитатьДо().
  • Записать в поток метку порядка байтов (BOM) для заданной кодировки с указанным порядком байтов. Используется статический метод ЗаписатьМеткуПорядкаБайтов(). Метод выбрасывает ИсключениеНедопустимыйАргумент, если указывается кодировка, отличная от UTF-8, UTF-16 или UTF-32.

Чтение данных

Для чтения данных предназначен тип ЧтениеДанных. Он создается конструктором, параметрами которого выступают поток, из которого будут читаться данные (источник данных), и настройки чтения данных. Настройки чтения данных задаются с помощью типа НастройкиЧтенияДанных, который позволяет управлять следующими настройками:
  • В какой кодировке будут читаться данные из этого потока (если из источника данных читается текстовая информация). Задается текстовым идентификатором кодировки. Свойство Кодировка.
  • Какой символ или их последовательность будет считаться разделителем строк (если из источника данных читается текстовая информация). Может быть простой строкой или массивом строк (если возможно использование нескольких разделителей строк). Свойство РазделителиСтрок.
  • Позволяет указать порядок следования байтов в словах: «младший-старший» ( little endian) или «старший-младший» ( big endian). Порядок следования байтов важен при записи многобайтовых данных (слов). Этот порядок может определяться архитектурой компьютера, на котором записывались данные, которые будут считываться из потока, или этот порядок определяется самим форматом читаемых данных (например, форматом файла). Задается с помощью значения типа ПорядокБайтов. Свойство ПорядокБайтов.
ЧтениеДанных позволяет выполнять следующие операции:
  • Проверить, что в источнике данных есть данные. Если при очередном чтении было прочитано меньше данных, чем было запрошено, возвращает значение Истина.
  • Прочитать один байт. Используется метод ПрочитатьБайт().
  • Прочитать целое число. Поддерживаются 16-разрядные, 32-разрядные и 64-разрядные целые числа. При чтении можно указать, с каким порядком байт будет считываться число. Если порядок не указан — будет использован порядок байт из настроек экземпляра ЧтениеДанных. Для чтения чисел используются методы ПрочитатьЦелое16(), ПрочитатьЦелое32() и ПрочитатьЦелое64().
  • Прочитать несколько символов или строку символов. Используются методы ПрочитатьСимволы() и ПрочитатьСтроку(). Разница заключается в том, что метод ПрочитатьСтроку() считывает поток до ближайшего разделителя строк, который указывается в качестве параметра метода или получается из настроек экземпляра ЧтениеДанных. Метод ПрочитатьСимволы() считает ровно то количество символов, которое указаны в параметре метода. В обоих методах имеется возможность указать кодировку считываемых данных. Если кодировка не указана в методе — будет использоваться кодировка из настроек экземпляра типа ЧтениеДанных.
  • Передвинуть позицию чтения в потоке вперед на какое-то количество байт (с помощью метода Пропустить()) или до выбранного маркера (метод ПропуститьДо()). Пр пропуске байт указывается — сколько байт надо пропустить. При пропуске до маркера — указывается один (в виде строки) или несколько (в виде массива) маркеров, по достижению которого (или одного из которых) пропуск прекращается. Для маркера можно указать используемую кодировку.
  • Прочитать массив данных произвольного размера (с помощью метода Прочитать()). Метод вернет экземпляр типа РезультатЧтенияДанных, который предназначен для хранения и обработки прочитанных данных. Метод ПрочитатьДо() отличается от метода Прочитать() только тем, что метод ПрочитатьДо() позволяет прочитать данные, размер которых заранее неизвестен. Но известен маркер, которым заканчивается текущая порция (или начинается следующая).

Результат чтения данных

Экземпляр типа РезультатЧтенияДанных получается при чтении данных из потока. Этот тип также может использоваться для записи данных в поток. Данный тип является закрываемым.

После получения значения данного типа, можно получить размер считанных данных (свойство Размер). Если при чтении данных использовались маркеры, то свойства МаркерНайден и ИндексМаркера, позволят узнать, что чтение было остановлено в результате нахождения маркера, а также понять, какой маркер был обнаружен.

Полученные данные можно использовать как источник для получения значения типа Байты (метод ПолучитьБайты()) или ПотокЧтения (метод ОткрытьПотокДляЧтения()). Каждый из этих методов можно вызывать многократно. До момента закрытия экземпляра, методы будут возвращать одинаковый результат.

Данные, которые считаны в экземпляр типа РезультатЧтенияДанных, могут быть сохранены во временном файле на диске. Файл удаляется после вызова метода экземпляра Закрыть() (явного или неявного).