1. ホーム
  2. c#

[解決済み] MemoryStream - 閉じたStreamにアクセスできません。

2022-01-30 07:47:07

質問

こんにちは、どうしてですか? using (var sw = new StreamWriter(ms)) リターン Cannot access a closed Stream exception . Memory Stream はこのコードの上にある。

using (var ms = new MemoryStream())
{
    using (var sw = new StreamWriter(ms))
    {                 
        sw.WriteLine("data");
        sw.WriteLine("data 2");
        ms.Position = 0;
        using (var sr = new StreamReader(ms))
        {
            Console.WriteLine(sr.ReadToEnd());                        
        }
    } //error here
}

どのように修正すればよいのでしょうか? ありがとうございます。

解決方法を教えてください。

これは StreamReader は、廃棄されるときに自動的に基礎となるストリームを閉じます。そのため using 文はこれを自動的に行います。

しかし StreamWriter を使用している場合、まだストリームで動作しようとしています(また using ライターのステートメントは、現在では StreamWriter そして、ストリームを閉じようとしている)。

これを解決する最善の方法は using を捨てないことです。 StreamReaderStreamWriter . 参照 この質問 .

using (var ms = new MemoryStream())
{
    var sw = new StreamWriter(ms);
    var sr = new StreamReader(ms);

    sw.WriteLine("data");
    sw.WriteLine("data 2");
    ms.Position = 0;

    Console.WriteLine(sr.ReadToEnd());                        
}

に嫌な思いをしたら swsr がコード内で廃棄されずにガベージコレクションされている場合(推奨)、そのようなことをすることができます。

StreamWriter sw = null;
StreamReader sr = null;

try
{
    using (var ms = new MemoryStream())
    {
        sw = new StreamWriter(ms);
        sr = new StreamReader(ms);

        sw.WriteLine("data");
        sw.WriteLine("data 2");
        ms.Position = 0;

        Console.WriteLine(sr.ReadToEnd());                        
    }
}
finally
{
    if (sw != null) sw.Dispose();
    if (sr != null) sr.Dispose();
}