Создает объект чтения из данного потока. После завершения работы с объектом ЧтениеДанных до того, как будет закрыт поток, переданный в конструктор, объект следует закрыть с помощью метода Закрыть или НачатьЗакрытие.
Синтаксис
Новый ЧтениеДанных(<Поток>, <КодировкаТекста>, <ПорядокБайтов>, <РазделительСтрок>, <КонвертируемыйРазделительСтрок>)Полное описание, параметры и ограничения
ЧтениеДанных.На основании потока
ЧтениеДанных (DataReader)
На основании потока
Доступен, начиная с версии 8.3.9.
Синтаксис:
Новый ЧтениеДанных(<Поток>, <КодировкаТекста>, <ПорядокБайтов>, <РазделительСтрок>, <КонвертируемыйРазделительСтрок>)
Параметры:
<Поток> (обязательный)
Тип: Поток, ПотокВПамяти, ФайловыйПоток.
Поток, из которого будет производиться чтение данных.
<КодировкаТекста> (необязательный)
Тип: КодировкаТекста, Строка.
Определяет кодировку текста, используемую для чтения данных. По умолчанию используется кодировка UTF-8.
Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки.
Поддерживаемые названия кодировок:
Adobe-Standard-Encoding - не поддерживается в веб-клиенте,
Big5 - не поддерживается в веб-клиенте,
Big5-HKSCS - не поддерживается в веб-клиенте,
BOCU-1 - не поддерживается в веб-клиенте,
CESU-8 - не поддерживается в веб-клиенте,
cp1006 - не поддерживается в веб-клиенте,
cp1025 - не поддерживается в веб-клиенте,
cp1097 - не поддерживается в веб-клиенте,
cp1098 - не поддерживается в веб-клиенте,
cp1112 - не поддерживается в веб-клиенте,
cp1122 - не поддерживается в веб-клиенте,
cp1123 - не поддерживается в веб-клиенте,
cp1124 - не поддерживается в веб-клиенте,
cp1125 - не поддерживается в веб-клиенте,
cp1131 - не поддерживается в веб-клиенте,
cp1386 - не поддерживается в веб-клиенте,
cp33722 - не поддерживается в веб-клиенте,
cp437 - не поддерживается в веб-клиенте,
cp737 - не поддерживается в веб-клиенте,
cp775 - не поддерживается в веб-клиенте,
cp850 - не поддерживается в веб-клиенте,
cp851 - не поддерживается в веб-клиенте,
cp852 - не поддерживается в веб-клиенте,
cp855 - не поддерживается в веб-клиенте,
cp856 - не поддерживается в веб-клиенте,
cp857 - не поддерживается в веб-клиенте,
cp858 - не поддерживается в веб-клиенте,
cp860 - не поддерживается в веб-клиенте,
cp861 - не поддерживается в веб-клиенте,
cp862 - не поддерживается в веб-клиенте,
cp863 - не поддерживается в веб-клиенте,
cp864 - не поддерживается в веб-клиенте,
cp865 - не поддерживается в веб-клиенте,
cp866 - не поддерживается в веб-клиенте,
CP868 - не поддерживается в веб-клиенте,
cp869 - не поддерживается в веб-клиенте,
cp874
cp875 - не поддерживается в веб-клиенте,
cp922 - не поддерживается в веб-клиенте,
cp930 - не поддерживается в веб-клиенте,
cp932 - не поддерживается в веб-клиенте,
cp933 - не поддерживается в веб-клиенте,
cp935 - не поддерживается в веб-клиенте,
cp937 - не поддерживается в веб-клиенте,
cp939 - не поддерживается в веб-клиенте,
cp949 - не поддерживается в веб-клиенте,
cp949c - не поддерживается в веб-клиенте,
cp950 - не поддерживается в веб-клиенте,
cp964 - не поддерживается в веб-клиенте,
ebcdic-ar - не поддерживается в веб-клиенте,
ebcdic-de - не поддерживается в веб-клиенте,
ebcdic-dk - не поддерживается в веб-клиенте,
ebcdic-he - не поддерживается в веб-клиенте,
ebcdic-xml-us - не поддерживается в веб-клиенте.
EUC-JP - не поддерживается в веб-клиенте,
EUC-KR - не поддерживается в веб-клиенте,
GB_2312-80 - не поддерживается в веб-клиенте,
gb18030 - не поддерживается в веб-клиенте,
GB2312 - не поддерживается в веб-клиенте,
GBK - не поддерживается в веб-клиенте,
hp-roman8 - не поддерживается в веб-клиенте,
HZ-GB-2312 - не поддерживается в веб-клиенте,
ibm-1047_P100-1995,swaplfnl - не поддерживается в веб-клиенте,
ibm-1129 - не поддерживается в веб-клиенте,
ibm-1130 - не поддерживается в веб-клиенте,
ibm-1132 - не поддерживается в веб-клиенте,
ibm-1133 - не поддерживается в веб-клиенте,
ibm-1137 - не поддерживается в веб-клиенте,
ibm-1140_P100-1997,swaplfnl - не поддерживается в веб-клиенте,
ibm-1142_P100-1997,swaplfnl - не поддерживается в веб-клиенте,
ibm-1143_P100-1997,swaplfnl - не поддерживается в веб-клиенте,
ibm-1144_P100-1997,swaplfnl - не поддерживается в веб-клиенте,
ibm-1145_P100-1997,swaplfnl - не поддерживается в веб-клиенте,
ibm-1146_P100-1997,swaplfnl - не поддерживается в веб-клиенте,
ibm-1147_P100-1997,swaplfnl - не поддерживается в веб-клиенте,
ibm-1148_P100-1997,swaplfnl - не поддерживается в веб-клиенте,
ibm-1149_P100-1997,swaplfnl - не поддерживается в веб-клиенте,
ibm-1153 - не поддерживается в веб-клиенте,
ibm-1153_P100-1999,swaplfnl - не поддерживается в веб-клиенте,
ibm-1154 - не поддерживается в веб-клиенте,
ibm-1155 - не поддерживается в веб-клиенте,
ibm-1156 - не поддерживается в веб-клиенте,
ibm-1157 - не поддерживается в веб-клиенте,
ibm-1158 - не поддерживается в веб-клиенте,
ibm-1160 - не поддерживается в веб-клиенте,
ibm-1162 - не поддерживается в веб-клиенте,
ibm-1164 - не поддерживается в веб-клиенте,
ibm-12712_P100-1998,swaplfnl - не поддерживается в веб-клиенте,
ibm-1363 - не поддерживается в веб-клиенте,
ibm-1364 - не поддерживается в веб-клиенте,
ibm-1371 - не поддерживается в веб-клиенте,
ibm-1388 - не поддерживается в веб-клиенте,
ibm-1390 - не поддерживается в веб-клиенте,
ibm-1399 - не поддерживается в веб-клиенте,
ibm-16684 - не поддерживается в веб-клиенте,
ibm-16804_X110-1999,swaplfnl - не поддерживается в веб-клиенте,
ibm-37_P100-1995,swaplfnl - не поддерживается в веб-клиенте,
ibm-4899 - не поддерживается в веб-клиенте,
ibm-4909 - не поддерживается в веб-клиенте,
ibm-4971 - не поддерживается в веб-клиенте,
ibm-5123 - не поддерживается в веб-клиенте,
ibm-803 - не поддерживается в веб-клиенте,
ibm-8482 - не поддерживается в веб-клиенте,
ibm-867 - не поддерживается в веб-клиенте,
ibm-901 - не поддерживается в веб-клиенте,
ibm-902 - не поддерживается в веб-клиенте,
ibm-971 - не поддерживается в веб-клиенте,
IBM-Thai - не поддерживается в веб-клиенте,
IBM01140 - не поддерживается в веб-клиенте,
IBM01141 - не поддерживается в веб-клиенте,
IBM01142 - не поддерживается в веб-клиенте,
IBM01143 - не поддерживается в веб-клиенте,
IBM01144 - не поддерживается в веб-клиенте,
IBM01145 - не поддерживается в веб-клиенте,
IBM01146 - не поддерживается в веб-клиенте,
IBM01147 - не поддерживается в веб-клиенте,
IBM01148 - не поддерживается в веб-клиенте,
IBM01149 - не поддерживается в веб-клиенте,
IBM037 - не поддерживается в веб-клиенте,
IBM1026 - не поддерживается в веб-клиенте,
IBM1047 - не поддерживается в веб-клиенте,
IBM278 - не поддерживается в веб-клиенте,
IBM280 - не поддерживается в веб-клиенте,
IBM284 - не поддерживается в веб-клиенте,
IBM285 - не поддерживается в веб-клиенте,
IBM290 - не поддерживается в веб-клиенте,
IBM297 - не поддерживается в веб-клиенте,
IBM367 ,
IBM420 - не поддерживается в веб-клиенте,
IBM424 - не поддерживается в веб-клиенте,
IBM500 - не поддерживается в веб-клиенте,
IBM870 - не поддерживается в веб-клиенте,
IBM871 - не поддерживается в веб-клиенте,
IBM918 - не поддерживается в веб-клиенте,
IMAP-mailbox-name - не поддерживается в веб-клиенте,
ISO_2022,locale=ja,version=3 - не поддерживается в веб-клиенте,
ISO_2022,locale=ja,version=4 - не поддерживается в веб-клиенте,
ISO_2022,locale=ko,version=1 - не поддерживается в веб-клиенте,
ISO-2022-CN - не поддерживается в веб-клиенте,
ISO-2022-CN-EXT - не поддерживается в веб-клиенте,
ISO-2022-JP - не поддерживается в веб-клиенте,
ISO-2022-JP-2 - не поддерживается в веб-клиенте,
ISO-2022-KR - не поддерживается в веб-клиенте,
ISO-8859-1 ,
iso-8859-13 ,
iso-8859-15 ,
iso-8859-2 ,
iso-8859-3 ,
iso-8859-4 ,
iso-8859-5 ,
iso-8859-6 ,
iso-8859-7 ,
iso-8859-8 ,
iso-8859-9 ,
JIS_Encoding - не поддерживается в веб-клиенте,
KOI8-R ,
KOI8-U ,
KSC_5601 - не поддерживается в веб-клиенте,
LMBCS-1 - не поддерживается в веб-клиенте,
LMBCS-11 - не поддерживается в веб-клиенте,
LMBCS-16 - не поддерживается в веб-клиенте,
LMBCS-17 - не поддерживается в веб-клиенте,
LMBCS-18 - не поддерживается в веб-клиенте,
LMBCS-19 - не поддерживается в веб-клиенте,
LMBCS-2 - не поддерживается в веб-клиенте,
LMBCS-3 - не поддерживается в веб-клиенте,
LMBCS-4 - не поддерживается в веб-клиенте,
LMBCS-5 - не поддерживается в веб-клиенте,
LMBCS-6 - не поддерживается в веб-клиенте,
LMBCS-8 - не поддерживается в веб-клиенте,
macintosh ,
SCSU - не поддерживается в веб-клиенте,
Shift_JIS - не поддерживается в веб-клиенте,
UTF-16 ,
UTF-16BE ,
UTF-16LE ,
UTF-32 - не поддерживается в веб-клиенте,
UTF-32BE - не поддерживается в веб-клиенте,
UTF-32LE - не поддерживается в веб-клиенте,
UTF-7 - не поддерживается в веб-клиенте,
UTF-8 ,
UTF16_OppositeEndian - не поддерживается в веб-клиенте,
UTF16_PlatformEndian - не поддерживается в веб-клиенте,
UTF32_OppositeEndian - не поддерживается в веб-клиенте,
UTF32_PlatformEndian - не поддерживается в веб-клиенте,
windows-1250 - не поддерживается в веб-клиенте,
windows-1251 ,
windows-1252 ,
windows-1253 ,
windows-1254 ,
windows-1255 ,
windows-1256 ,
windows-1257 ,
windows-1258 ,
windows-57002 - не поддерживается в веб-клиенте,
windows-57003 - не поддерживается в веб-клиенте,
windows-57004 - не поддерживается в веб-клиенте,
windows-57005 - не поддерживается в веб-клиенте,
windows-57007 - не поддерживается в веб-клиенте,
windows-57008 - не поддерживается в веб-клиенте,
windows-57009 - не поддерживается в веб-клиенте,
windows-57010 - не поддерживается в веб-клиенте,
windows-57011 - не поддерживается в веб-клиенте,
windows-874 - не поддерживается в веб-клиенте,
windows-949 - не поддерживается в веб-клиенте,
windows-950 - не поддерживается в веб-клиенте,
x-mac-centraleurroman - не поддерживается в веб-клиенте,
x-mac-cyrillic ,
x-mac-greek - не поддерживается в веб-клиенте,
x-mac-turkish - не поддерживается в веб-клиенте,
Значение по умолчанию: UTF8.
<ПорядокБайтов> (необязательный)
Тип: ПорядокБайтов.
Порядок байтов, используемый для декодирования целых чисел при чтении из потока.
Значение по умолчанию: LittleEndian.
<РазделительСтрок> (необязательный)
Тип: Строка.
Определяет строку, разделяющую строки в потоке.
Значение по умолчанию: Неопределено.
<КонвертируемыйРазделительСтрок> (необязательный)
Тип: Строка.
Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС.
Значение по умолчанию: ВК + ПС.
Описание:
Создает объект чтения из данного потока.
После завершения работы с объектом ЧтениеДанных до того, как будет закрыт поток, переданный в конструктор, объект следует закрыть с помощью метода Закрыть или НачатьЗакрытие.
Использование в версии:
Доступен, начиная с версии 8.3.9.
Методическая информация
Практические примеры
Собрать пакет с версией, количеством и UTF-8 названием
Пакет имеет согласованную структуру: 1 байт версии, 2 байта количества, 4 байта длины названия, затем UTF-8. Проверяем поля до чтения тела.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Серверный контекст, только память. Это учебный протокол, не формат какого-либо реального API.
Название кодируется в UTF-8 без BOM; целые записываются в LittleEndian.
В конструктор записи и чтения передаётся уже созданный поток: его закрываем отдельно после закрытия обоих объектов.
Название = ПолучитьБуферДвоичныхДанныхИзСтроки("Книга", КодировкаТекста.UTF8, Ложь);
Поток = Новый ПотокВПамяти;
Попытка
Запись = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian);
Попытка
Запись.ЗаписатьБайт(1);
Запись.ЗаписатьЦелое16(3);
Запись.ЗаписатьЦелое32(Название.Размер);
Запись.ЗаписатьБуферДвоичныхДанных(Название);
Исключение
Запись.Закрыть();
ВызватьИсключение;
КонецПопытки;
Запись.Закрыть();
Сообщить(Поток.Размер());
Поток.Перейти(0, ПозицияВПотоке.Начало);
Чтение = Новый ЧтениеДанных(Поток, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian);
Попытка
Версия = Чтение.ПрочитатьБайт();
Если Версия <> 1 Тогда
ВызватьИсключение "Неподдерживаемая версия пакета";
КонецЕсли;
Количество = Чтение.ПрочитатьЦелое16();
Длина = Чтение.ПрочитатьЦелое32();
Если Количество = Неопределено Или Длина = Неопределено Тогда
ВызватьИсключение "Заголовок пакета оборван";
КонецЕсли;
Если Длина < 0 Или Длина > 1024 Тогда
ВызватьИсключение "Недопустимая длина названия";
КонецЕсли;
Результат = Чтение.Прочитать(Длина);
Если Результат.Размер <> Длина Тогда
ВызватьИсключение "Название получено не полностью";
КонецЕсли;
БуферНазвания = Результат.ПолучитьБуферДвоичныхДанных();
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(БуферНазвания, КодировкаТекста.UTF8));
Сообщить(Количество);
Сообщить(Результат.ПолучитьДвоичныеДанные().Размер());
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Исключение
Поток.Закрыть();
ВызватьИсключение;
КонецПопытки;
Поток.Закрыть();Разбор по шагам
Записываем поля заголовка в фиксированном порядке и длину тела в байтах.
Закрыть объекта записи сбрасывает её буферы, не закрывая переданный извне поток.
Возвращаем позицию в начало и читаем поля в том же порядке и с тем же порядком байтов.
Ограничиваем длину, проверяем фактический размер прочитанного тела и лишь затем декодируем название.
Как проверить результат
Размер пакета 17 байтов: 1 + 2 + 4 + 10; результат Книга и количество 3.
Замените записанную версию 1 на 2: чтение должно завершиться текстом Неподдерживаемая версия пакета.
Укажите при записи длину 100 вместо фактических 10: должна сработать проверка неполного названия.
Ожидаемый результат
Пакет прочитан с проверкой версии, ограничением размера и контролем неполного тела.
На что обратить внимание
Для сетевого потока частичное чтение может быть нормальным: в реальном сетевом протоколе собирайте тело циклом до нужного размера или завершения потока.
Нельзя доверять длине из внешнего пакета без верхнего ограничения: иначе можно выделить чрезмерную память.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Скопировать только непрочитанный хвост в отдельный поток
После чтения трёхбайтового заголовка HDR копируем BODY. КопироватьВ не начинает чтение заново.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Используйте отдельную учебную базу. Фрагмент без директив вставьте в тело серверной процедуры ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.
Все исходные байты создаются самим примером в памяти. Файлы, сеть, справочники и документы не нужны.
Запускайте задачи отдельно. После закрытия ЧтениеДанных/ЗаписьДанных не используйте этот экземпляр повторно.
Данные = ПолучитьДвоичныеДанныеИзСтроки("HDRBODY", КодировкаТекста.UTF8, Ложь);
Исходный = Данные.ОткрытьПотокДляЧтения();
Чтение = Новый ЧтениеДанных(Исходный);
Целевой = Новый ПотокВПамяти;
Попытка
Сообщить(Чтение.ИсходныйПоток() = Исходный);
Сообщить(Чтение.ПрочитатьСимволы(3) = "HDR");
Скопировано = Чтение.КопироватьВ(Целевой);
Сообщить(Скопировано = 4);
Исключение
Чтение.Закрыть();
Исходный.Закрыть();
Целевой.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Исходный.Закрыть();
Тело = Целевой.ЗакрытьИПолучитьДвоичныеДанные();
Сообщить(Тело.Размер() = 4);
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Тело, КодировкаТекста.UTF8) = "BODY");Разбор по шагам
Явно открываем исходный поток из собственных ДвоичныеДанные и передаём его оболочке чтения.
ИсходныйПоток возвращает переданный поток; это метод, а не свойство без скобок.
Три символа HDR уже прочитаны. КопироватьВ переносит оставшиеся четыре байта, возвращая фактическое количество.
Сначала закрываем ЧтениеДанных, затем исходный поток, которым владеет наш код.
Получаем результат из целевого потока после копирования и проверяем, что заголовка в нём нет.
Как проверить результат
Скопировано ровно четыре байта; результат BODY, а не HDRBODY.
Все пять сравнений Истина; оба потока закрываются и при исключении.
Ожидаемый результат
Скопирован непрочитанный остаток с явным управлением временем жизни потоков.
На что обратить внимание
Не перемещайте вложенный ИсходныйПоток напрямую во время работы оболочки: у неё может быть буфер чтения.
Закрытие оболочки не закрывает отдельно созданный переданный поток автоматически. Закрываем его сами.
Для реального большого файла копирование лучше выполнять без полного чтения исходных данных в память. Здесь память выбрана для безопасной подготовки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.