ПотокВПамяти.УстановитьРазмер

Методы · SetSize

Устанавливает размер потока. Если текущий размер превышает заданный, поток будет сокращен до заданного размера, а информация, превышающая заданный размер, будет потеряна. Если текущий размер потока меньше заданного, то содержимое потока между старым и новым размером не определено.

Синтаксис

УстановитьРазмер(<Размер>)
Полное описание, параметры и ограничения

ПотокВПамяти.УстановитьРазмер (MemoryStream.SetSize)

ПотокВПамяти (MemoryStream)

УстановитьРазмер (SetSize)

Доступен, начиная с версии 8.3.9.

Синтаксис:
УстановитьРазмер(<Размер>)
Параметры:

<Размер> (обязательный)
Тип: Число.
Устанавливаемый размер потока.
Описание:

Устанавливает размер потока.
Если текущий размер превышает заданный, поток будет сокращен до заданного размера, а информация, превышающая заданный размер, будет потеряна.
Если текущий размер потока меньше заданного, то содержимое потока между старым и новым размером не определено.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.

Примечание:
Установить длину потока можно только в том случае, если в потоке разрешены запись и изменение позиции. В противном случае будет сгенерировано исключение.
См. также:
Поток, метод НачатьУстановкуРазмера
Поток, метод Размер
Поток, метод УстановитьРазмерАсинх

Использование в версии:

Доступен, начиная с версии 8.3.9.

Описание изменено в версии 8.3.18.

Методическая информация

Практические примеры

Записать байты в поток, прочитать часть и скопировать остаток

Поток хранит текущую позицию. Начальная ёмкость не означает заполненный размер; после записи чтение начинается с конца, пока позиция не изменена.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Выполняйте на сервере; все потоки в памяти, файлов нет.

  2. Исходные четыре байта: 1, 2, 3, 4; ёмкость первого потока 64 — резерв памяти, не число данных.

Буфер = Новый БуферДвоичныхДанных(4);
Для Номер = 0 По 3 Цикл
    Буфер.Установить(Номер, Номер + 1);
КонецЦикла;
Поток = Новый ПотокВПамяти(64);
Копия = Новый ПотокВПамяти;
Попытка
    Сообщить(Поток.Размер());
    Сообщить(Поток.ДоступнаЗапись);
    Сообщить(Поток.ДоступноЧтение);
    Сообщить(Поток.ДоступноИзменениеПозиции);
    Поток.Записать(Буфер, 0, 4);
    Поток.СброситьБуферы();
    Сообщить(Поток.ТекущаяПозиция());
    Поток.Перейти(0, ПозицияВПотоке.Начало);
    Прочитанное = Новый БуферДвоичныхДанных(2);
    Прочитано = Поток.Прочитать(Прочитанное, 0, 2);
    Сообщить(Прочитано);
    Сообщить(Прочитанное.Получить(0));
    Поток.КопироватьВ(Копия, 2);
    Сообщить(Копия.Размер());
    ДанныеКопии = Копия.ЗакрытьИПолучитьДвоичныеДанные();
    Копия = Неопределено;
    Сообщить(ПолучитьHexСтрокуИзДвоичныхДанных(ДанныеКопии));
    Поток.УстановитьРазмер(3);
    Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Поток = Неопределено;
Исключение
    Если Копия <> Неопределено Тогда
        Копия.Закрыть();
    КонецЕсли;
    Если Поток <> Неопределено Тогда
        Поток.Закрыть();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;
Сообщить(ПолучитьHexСтрокуИзДвоичныхДанных(Данные));
Основа = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Данные);
ПотокИзБуфера = Новый ПотокВПамяти(Основа);
Сообщить(ПотокИзБуфера.Размер());
ПотокИзБуфера.Закрыть();

Разбор по шагам

  1. Создаём два потока и проверяем размер пустого потока: 0.

  2. После записи позиция 4; Перейти перемещает её к началу для чтения.

  3. Прочитать возвращает фактическое число байтов. КопироватьВ начинает с текущей позиции, поэтому копирует только 3 и 4.

  4. УстановитьРазмер сокращает первый поток до трёх байтов; ЗакрытьИПолучитьДвоичныеДанные выдаёт содержимое и закрывает поток.

Как проверить результат

  1. Прочитано 2 байта, первый равен 1; содержимое копии в Hex — 0304.

  2. После сокращения исходные данные в Hex — 010203; поток, созданный на их буфере, имеет размер 3.

Ожидаемый результат

Частичное чтение, копирование остатка и сокращение потока выполнены без файлов.

На что обратить внимание

  1. После ЗакрытьИПолучитьДвоичныеДанные поток больше не используйте.

  2. Прочитать может вернуть меньше запрошенного количества, особенно у сетевых потоков: всегда проверяйте возвращённое число.

  3. НачальнаяЁмкость — объём резервирования, УстановитьРазмер — изменение фактических данных; это разные операции.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.