Выполняет чтение заданного количества байтов в указанный буфер по указанному смещению. Текущая позиция смещается вперед на фактическое количество прочитанных байтов. Чтение из потока возможно только, если поток поддерживает чтение. В противном случае, будет вызвано исключение. При чтении размер целевого буфера не меняется, а его содержимое перезаписывается фактически прочитанными данными. Если в буфере недостаточно места для записи прочитанных данных, происходит ошибка переполнения.
Синтаксис
Прочитать(<Буфер>, <ПозицияВБуфере>, <Количество>)Полное описание, параметры и ограничения
Поток.Прочитать (Stream.Read)
Поток (Stream)
Прочитать (Read)
Доступен, начиная с версии 8.3.9.
Синтаксис:
Прочитать(<Буфер>, <ПозицияВБуфере>, <Количество>)
Параметры:
<Буфер> (обязательный)
Тип: БуферДвоичныхДанных.
Буфер, в который выполняется чтение.
<ПозицияВБуфере> (обязательный)
Тип: Число.
Позиция в целевом буфере, начиная с которой требуется записывать данные из потока.
<Количество> (обязательный)
Тип: Число.
Количество байт, которые требуется записать в целевой буфер.
Возвращаемое значение:
Тип: Число.
Фактически прочитанное количество байтов. Может быть меньше,указанного, если достигнут конец потока.
Описание:
Выполняет чтение заданного количества байтов в указанный буфер по указанному смещению. Текущая позиция смещается вперед на фактическое количество прочитанных байтов.
Чтение из потока возможно только, если поток поддерживает чтение. В противном случае, будет вызвано исключение.
При чтении размер целевого буфера не меняется, а его содержимое перезаписывается фактически прочитанными данными. Если в буфере недостаточно места для записи прочитанных данных, происходит ошибка переполнения.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
См. также:
Поток, метод НачатьЧтение
Поток, метод ПрочитатьАсинх
Использование в версии:
Доступен, начиная с версии 8.3.9.
Описание изменено в версии 8.3.18.
Методическая информация
Практические примеры
Получить поток только для чтения и увидеть общую позицию
Readonly-вид разделяет данные и позицию с файловым потоком. Это не независимая копия файла и не запрет изменения файла всеми процессами.
Где и как запускать
Серверная процедура отдельной учебной базы; локальный временный файл сервера.
Подготовка
Каждый фрагмент запускайте отдельно в серверной процедуре своей учебной базы. Файл создаётся во временном каталоге сервера, не на компьютере клиента.
Пример получает новое временное имя и использует СоздатьНовый, не Создать. Чужой существующий файл никогда не открывается для перезаписи.
После завершения/ошибки закрываются только созданные потоки и удаляется только точное собственное имя. Это не резервная копия и не операция над вашими XML.
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
УчебныйФайл = Новый Файл(ИмяФайла);
Если УчебныйФайл.Существует() Тогда
ВызватьИсключение "Временное имя уже занято: чужой файл не открываем";
КонецЕсли;
Поток = Неопределено;
Вид = Неопределено;
Копия = Неопределено;
СозданСвойФайл = Ложь;
Попытка
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
СозданСвойФайл = Истина;
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Поток.Записать(Буфер, 0, Буфер.Размер);
Поток.Перейти(0, ПозицияВПотоке.Начало);
Вид = Поток.ПолучитьПотокТолькоДляЧтения();
Сообщить(Вид.ДоступноЧтение);
Сообщить(Не Вид.ДоступнаЗапись);
Сообщить(Вид.ДоступноИзменениеПозиции);
Сообщить(Вид.Размер() = 6);
Сообщить(Вид.Перейти(2, ПозицияВПотоке.Начало) = 2);
Сообщить(Поток.ТекущаяПозиция() = 2);
Часть = Новый БуферДвоичныхДанных(2);
Сообщить(Вид.Прочитать(Часть, 0, 2) = 2);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Часть, КодировкаТекста.UTF8) = "C1");
Сообщить(Вид.ТекущаяПозиция() = 4);
Сообщить(Поток.ТекущаяПозиция() = 4);
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
Сообщить(Не УчебныйФайл.Существует());Разбор по шагам
Заполняем собственный файл и возвращаемся в начало до получения readonly-вида.
Читаем реальные возможности Вид, полученного как Поток. ДоступнаЗапись ложна, но изменение позиции допускается.
Переход в виде меняет общую позицию источника; чтение C1 передвигает оба до 4.
Все операции выполняем до закрытия любого из связанных потоков; после этого оба больше не используем.
Как проверить результат
Десять сравнений Истина: возможности, размеры, обе общие позиции и C1.
Данные не копировались во второй файл. Чтение вида не изменяло содержимое ABC123.
Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.
Ожидаемый результат
Показано разделение данных и позиции между потоком и readonly-видом.
На что обратить внимание
Если нужен независимый курсор, создайте отдельную копию/поток, а не ещё один readonly-вид.
Readonly относится к данному API доступа. Это не ACL, шифрование и не глобальная блокировка файла.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Проверить запрет записи и изменения размера readonly-потока
Пробуем только два намеренно запрещённых действия со своим файлом. Исключения учитываем, затем проверяем неизменность данных.
Где и как запускать
Серверная процедура отдельной учебной базы; локальный временный файл сервера.
Подготовка
Каждый фрагмент запускайте отдельно в серверной процедуре своей учебной базы. Файл создаётся во временном каталоге сервера, не на компьютере клиента.
Пример получает новое временное имя и использует СоздатьНовый, не Создать. Чужой существующий файл никогда не открывается для перезаписи.
После завершения/ошибки закрываются только созданные потоки и удаляется только точное собственное имя. Это не резервная копия и не операция над вашими XML.
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
УчебныйФайл = Новый Файл(ИмяФайла);
Если УчебныйФайл.Существует() Тогда
ВызватьИсключение "Временное имя уже занято: чужой файл не открываем";
КонецЕсли;
Поток = Неопределено;
Вид = Неопределено;
Копия = Неопределено;
СозданСвойФайл = Ложь;
Попытка
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
СозданСвойФайл = Истина;
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Поток.Записать(Буфер, 0, Буфер.Размер);
Вид = Поток.ПолучитьПотокТолькоДляЧтения();
Отказов = 0;
Попытка
Вид.Записать(Буфер, 0, 1);
Исключение
Отказов = Отказов + 1;
Сообщить("Ожидаемый запрет записи: " + ОписаниеОшибки());
КонецПопытки;
Попытка
Вид.УстановитьРазмер(2);
Исключение
Отказов = Отказов + 1;
Сообщить("Ожидаемый запрет размера: " + ОписаниеОшибки());
КонецПопытки;
Сообщить(Отказов = 2);
Сообщить(Вид.Размер() = 6);
Вид.Перейти(0, ПозицияВПотоке.Начало);
Проверка = Новый БуферДвоичныхДанных(6);
Сообщить(Вид.Прочитать(Проверка, 0, 6) = 6);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Проверка, КодировкаТекста.UTF8) = "ABC123");
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
Сообщить(Не УчебныйФайл.Существует());Разбор по шагам
Получаем readonly-вид только уже созданного собственным уроком файла.
Записать и УстановитьРазмер оборачиваем по отдельности, чтобы проверить оба отказа.
Счётчик сравниваем после блоков перехвата; затем читаем фактический размер и весь исходный текст.
Как проверить результат
Два сообщения об ожидаемых запретах; четыре финальных сравнения Истина.
Размер 6 и содержимое ABC123 не изменились. Пойманная ошибка не называется успешной записью.
Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.
Ожидаемый результат
На настоящем readonly-виде проверены два запрета изменения.
На что обратить внимание
В рабочем коде сначала проверяйте ДоступнаЗапись, а не используйте исключение для обычного управления потоком.
Readonly-вид не превращает изменяемые исходные данные в резервную копию.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.