如何将StreamReader和StreamWriter部署在同一个内存流上?

ret*_*ide 1 c# stream

 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 的正确方法是什么?

请给我一些建议?

Typ*_*eIA 5

实际上,不会发生任何可怕的事情,因为它们的方法中既没有MemoryStreamStreamReader没有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