class StreamReaderWriterDemo : AbastractDemo
{
public override void Run()
{
string message = "hello this is a test 0000";
string result = string.Empty;
try
{
using (var memoryStream = new MemoryStream())
{
StreamWriter streamWriter = new StreamWriter(memoryStream, Encoding.Default);
this.WriteToStream(streamWriter, memoryStream, message);
memoryStream.Position = 0;
StreamReader streamReader = new StreamReader(memoryStream, Encoding.Default);
result = this.ReadFromStream(streamReader, memoryStream);
streamWriter.Dispose();
streamReader.Dispose();
}
}
catch (Exception ex)
{
}
Console.WriteLine(result);
}
private void WriteToStream(StreamWriter streamWriter, MemoryStream stream, string message)
{
streamWriter.Write(message);
streamWriter.Flush();
streamWriter.Close();
}
private string ReadFromStream(StreamReader streamReader, MemoryStream stream)
{
string result;
result = streamReader.ReadToEnd();
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我很难处置streamReader阅读器,因为streamWriter.Dsipose()已经处置了memoryStream。
所以我有点困惑,这是否意味着我不必处置 StreamReader 或streamWriter?
处理使用相同内存流的 StreamWriter、StreamReader 的正确方法是什么?
请给我一些建议?
实际上,不会发生任何可怕的事情,因为它们的方法中既没有MemoryStream也StreamReader没有StreamWriter做任何花哨的事情Dispose()(这可以使用 .NET Reflector 之类的东西来验证)。但你不应该假设这一点。
为了正确性,所有实现的类型的对象都IDisposable应该被丢弃。执行此操作的最佳方法是使用using您在示例中使用的构造。但您还应该将它用于读取器和写入器,而不仅仅是内存流:
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream, Encoding.Default))
using (var streamReader = new StreamReader(memoryStream, Encoding.Default))
{
this.WriteToStream(streamWriter, memoryStream, message);
memoryStream.Position = 0;
result = this.ReadFromStream(streamReader, memoryStream);
}
Run Code Online (Sandbox Code Playgroud)
处理所有 3 个物体并没有什么问题,即使其中两个“包裹”了第三个。(事实上,你应该这样做。)
如果您希望在处置读取器/写入器后能够继续使用内存流,则该类有一个构造函数StreamReader,该构造函数采用一个标志,告诉它在处置读取器后使底层流保持打开状态。有一个类似的构造函数。StreamWriter