2017-02-02 5 views
2

Я делаю некоторые тесты и заменяю поток, который обычно поступает из веб-запроса с потоком, который я создал.Как создать читаемый поток?

Я создаю поток, как это:

MemoryStream responseDataStream = new MemoryStream(); 

using (StreamWriter sw = new StreamWriter(responseDataStream)) 
{ 
    sw.Write(responseData); 
    sw.Flush(); 
    sw.Close(); 
} 

Однако, когда мой код пытается потреблять:

StreamReader reader = new StreamReader(myStream);

Я получаю ошибку Stream was not readable.

Я хочу, чтобы подготовить свой чтобы он был готов к потреблению. Как я могу это сделать?

+1

Попробуйте установить 'stream.Position = 0;' перед его чтением. –

ответ

5

По умолчанию StreamWriter берет на себя ответственность за поток, который вы передаете в конструкторе. Когда стример закрыт, он также закрывает базовый поток. Вам нужно использовать другую перегрузку конструктора, например. new StreamWriter(responseDataStream, Encoding.UTF8, true).

Во-вторых, поток по-прежнему находится в положении последней записи. Вам необходимо перемотать его обратно:

responseDataStream.Position = 0; 
+0

Когда поток памяти закрыт, потому что вы написали ему и закрыли потоковик, значит, он просто исчезает в эфире? – NibblyPig

+0

@NibblyPig Нет - но он закрыт. Он по-прежнему позволяет вам вызывать 'ToArray' (это наиболее распространенный прецедент для потока памяти - чтение потока в массив байтов или наоборот), но большинство других вещей запрещено. Это не внешняя концепция - если вы закрываете сокет, вы наверняка не ожидаете, что он все равно сможет получать данные :) – Luaan

+0

Прохладный, спасибо за ваш ответ и объяснение :) – NibblyPig

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

  • Нет связанных вопросов^_^