Устанавливает размер потока. Если текущий размер превышает заданный, поток будет сокращен до заданного размера, а информация, превышающая заданный размер, будет потеряна. Если текущий размер потока меньше заданного, то содержимое потока между старым и новым размером не определено.
Синтаксис
УстановитьРазмер(<Размер>)Полное описание, параметры и ограничения
ПотокВПамяти.УстановитьРазмер (MemoryStream.SetSize)
ПотокВПамяти (MemoryStream)
УстановитьРазмер (SetSize)
Доступен, начиная с версии 8.3.9.
Синтаксис:
УстановитьРазмер(<Размер>)
Параметры:
<Размер> (обязательный)
Тип: Число.
Устанавливаемый размер потока.
Описание:
Устанавливает размер потока.
Если текущий размер превышает заданный, поток будет сокращен до заданного размера, а информация, превышающая заданный размер, будет потеряна.
Если текущий размер потока меньше заданного, то содержимое потока между старым и новым размером не определено.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
Примечание:
Установить длину потока можно только в том случае, если в потоке разрешены запись и изменение позиции. В противном случае будет сгенерировано исключение.
См. также:
Поток, метод НачатьУстановкуРазмера
Поток, метод Размер
Поток, метод УстановитьРазмерАсинх
Использование в версии:
Доступен, начиная с версии 8.3.9.
Описание изменено в версии 8.3.18.
Методическая информация
Практические примеры
Записать байты в поток, прочитать часть и скопировать остаток
Поток хранит текущую позицию. Начальная ёмкость не означает заполненный размер; после записи чтение начинается с конца, пока позиция не изменена.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Выполняйте на сервере; все потоки в памяти, файлов нет.
Исходные четыре байта: 1, 2, 3, 4; ёмкость первого потока 64 — резерв памяти, не число данных.
Буфер = Новый БуферДвоичныхДанных(4);
Для Номер = 0 По 3 Цикл
Буфер.Установить(Номер, Номер + 1);
КонецЦикла;
Поток = Новый ПотокВПамяти(64);
Копия = Новый ПотокВПамяти;
Попытка
Сообщить(Поток.Размер());
Сообщить(Поток.ДоступнаЗапись);
Сообщить(Поток.ДоступноЧтение);
Сообщить(Поток.ДоступноИзменениеПозиции);
Поток.Записать(Буфер, 0, 4);
Поток.СброситьБуферы();
Сообщить(Поток.ТекущаяПозиция());
Поток.Перейти(0, ПозицияВПотоке.Начало);
Прочитанное = Новый БуферДвоичныхДанных(2);
Прочитано = Поток.Прочитать(Прочитанное, 0, 2);
Сообщить(Прочитано);
Сообщить(Прочитанное.Получить(0));
Поток.КопироватьВ(Копия, 2);
Сообщить(Копия.Размер());
ДанныеКопии = Копия.ЗакрытьИПолучитьДвоичныеДанные();
Копия = Неопределено;
Сообщить(ПолучитьHexСтрокуИзДвоичныхДанных(ДанныеКопии));
Поток.УстановитьРазмер(3);
Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Поток = Неопределено;
Исключение
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Сообщить(ПолучитьHexСтрокуИзДвоичныхДанных(Данные));
Основа = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Данные);
ПотокИзБуфера = Новый ПотокВПамяти(Основа);
Сообщить(ПотокИзБуфера.Размер());
ПотокИзБуфера.Закрыть();Разбор по шагам
Создаём два потока и проверяем размер пустого потока: 0.
После записи позиция 4; Перейти перемещает её к началу для чтения.
Прочитать возвращает фактическое число байтов. КопироватьВ начинает с текущей позиции, поэтому копирует только 3 и 4.
УстановитьРазмер сокращает первый поток до трёх байтов; ЗакрытьИПолучитьДвоичныеДанные выдаёт содержимое и закрывает поток.
Как проверить результат
Прочитано 2 байта, первый равен 1; содержимое копии в Hex — 0304.
После сокращения исходные данные в Hex — 010203; поток, созданный на их буфере, имеет размер 3.
Ожидаемый результат
Частичное чтение, копирование остатка и сокращение потока выполнены без файлов.
На что обратить внимание
После ЗакрытьИПолучитьДвоичныеДанные поток больше не используйте.
Прочитать может вернуть меньше запрошенного количества, особенно у сетевых потоков: всегда проверяйте возвращённое число.
НачальнаяЁмкость — объём резервирования, УстановитьРазмер — изменение фактических данных; это разные операции.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.