2015-05-02 2 views
1

У меня есть MemoryStream, что я заполняю некоторые данные с помощью StreamWriter. В конце я хочу сбросить его в другой поток (не всегда файл).Должен ли я использовать Stream.Flush перед Stream.CopyTo?

Должен ли я вызвать Stream.Flush перед использованием метода Steram.CopyTo?

+0

Что является причиной этого вопроса? Вы можете решить проблему, которую пытаетесь решить? Если это вопрос любопытства, то нет, вам не нужно очищать текущие данные перед использованием CopyTo для любого потока. –

ответ

1

Вам не нужно вызывать Flush в потоке памяти, потому что операция ничего не делает. Если вы посмотрите на источник, реализация пуста. Вам нужно перемотать поток после записи.

Однако вам необходимо очистить StreamWriter, чтобы все данные были перенесены в поток памяти, прежде чем вы начнете его копировать.

Вы можете использовать этот шаблон с StreamWriter писать в поток памяти, чтобы избежать явной гиперемии:

MemoryStream memStream = ... 
using (StreamWriter wr = new StreamWriter(memStream)) { 
    ... // Do the writing 
} 
memStream.Position = 0; // Rewind 
// At this point `memStream` has all data pushed into it, 
// and is positioned at zero, so it's ready to be copied. 
+0

Спасибо. Где вы проверяете исходный код MemoryStream.Flush()? – Hooch

+0

@ Hooch Я нашел источник в Интернете [здесь] (http://reflector.webtropy.com/default.aspx/[email protected]/[email protected]/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/ система/IO/MemoryStream @ CS/1305376/MemoryStream @ CS). Прокрутите вниз или найдите код (более 250 + строк - это комментарии, которые теряются в отраженных источниках). – dasblinkenlight

+0

Спасибо. Это пригодится в таких ситуациях, как эта. – Hooch

1

Должен ли я вызвать Stream.Flush перед использованием метода Stream.CopyTo?

Нет, нет необходимости звонить Flush. Но вам нужно будет сбросить Position на 0 на MemoryStream.

CopyTo В документы говорят:

Копирование начинается с текущей позиции в текущем потоке, и не сбрасывает позицию потока назначения после того, как операция копирования завершена.

1

Я думаю, вам не нужно вызывать Stream.Flush с потоком памяти, потому что он не делает ничего :

переопределяет метод Stream.Flush так, что не выполняется никаких действий.

https://msdn.microsoft.com/en-us/library/system.io.memorystream.flush(v=vs.110).aspx

В принципе, Stream.Flush предназначен для вас, чтобы очистить свой буфер памяти для постоянного хранения. С MemoryStream, Flush ничего не делает.

Смежные вопросы