Вопрос

Как обсуждавшийся ранее, когда BinaryReader или BinaryWriter закрывается, его базовый поток также закрывается (aargh).Рассмотрим эту ситуацию:рутина R передается ли поток памяти, скажем M;Я хотел бы написать кое-что для M а затем передайте его другой подпрограмме для дополнительной обработки (не обязательно записи).Для удобства я бы хотел обернуть M в BinaryWriter для выполнения моего написания.После написания я закончил с BinaryWriter, но не с M.

void R(MemoryStream M)
{
    using (B = new BinaryWriter(M))
    {
        // write some stuff using B
    }

    S(M);  // now pass M to another routine for further processing
}

Но я не могу избавиться от BinaryStream без закрытия M.

Q:Есть ли способ сделать что-либо из следующего?

  • извлеките базовый байт[] из потока памяти,
  • клонирование потока
  • повторно откройте поток после того, как он был закрыт
Это было полезно?

Решение 4

Благодаря нескольким, кто предложил toArray, я пришел к правильному ответу, который является `M.GetBuffer'.Собрать не так уж плохо, но это

  • создает копию
  • получает только часть буфера

GetBuffer просто захватывает ссылку на базовый байт[], что мне и нужно.

Другие советы

Вам лучше получить базовый буфер byte[], используя

byte[] buffer = ms.GetBuffer();

А затем скопируйте байтовые данные, используя массив.Метод Copy().Вы можете свободно создавать с его помощью новый поток.

Вы можете использовать такие вещи, как MiscUtil.IO.NonClosingStreamWrapper в Неправильно использованный, который оборачивает Stream и просто игнорирует Close/Dispose Запросы.Именно с этой целью.

void R(MemoryStream M)
{
    using (B = new BinaryWriter(new NonClosingStreamWrapper(M)))
    {
        // write some stuff using B
    }

    S(M);  // now pass M to another routine for further processing
}    

Ты можешь:

  • Вызовите M.toArray(), чтобы получить поток в виде массива байтов.
  • Создайте подкласс BinaryWriter и переопределите метод Dispose, чтобы предотвратить закрытие дочернего потока

Просто чтобы добавить это сюда, очень простым решением было бы не распоряжаться() автором.

void R(MemoryStream M)
{
    B = new BinaryWriter(M);

    // write some stuff using B        
    B.Flush();
    S(M);  // now pass M to another routine for further processing
}

Теперь вам нужно беспокоиться только о сохранении B в области видимости, каковой она будет во время R().

Возможно, это не лучшее решение в данном случае, но стоит отметить, что Читателям и Авторам не нужно Избавляться от себя.

Несколько наивный подход заключается в использовании

byte buf[] = MemoryStream.ToArray();

Скопировать содержимое потока в массив байтов.Вы можете превратить его обратно в поток с помощью

MemoryStream ms = new MemoryStream(buf);

В соответствии с это M.Клон();должно сработать.Но я могу ошибаться...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top