programing

메모리 스트림 - 닫힌 스트림에 액세스할 수 없음

linuxpc 2023. 4. 26. 23:02
반응형

메모리 스트림 - 닫힌 스트림에 액세스할 수 없음

안녕 왜?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그리고 그것을 처분하지 마세요.StreamReader그리고.StreamWriter 질문을 참조하십시오.

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());                        
}

당신이 기분이 나쁘다면,sw그리고.sr코드에서 폐기되지 않고 쓰레기 처리(권장 사항)되는 경우 다음과 같은 작업을 수행할 수 있습니다.

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();
}

.net45 이후로 당신은 사용할 수 있습니다.LeaveOpen의 생성자 주장StreamWriter그리고 여전히 그것을 사용합니다.using진술.예:

using (var ms = new MemoryStream())
{
    using (var sw = new StreamWriter(ms, leaveOpen:true))
    {
        sw.WriteLine("data");
        sw.WriteLine("data 2");    
    }

    ms.Position = 0;
    using (var sr = new StreamReader(ms))
    {
        Console.WriteLine(sr.ReadToEnd());
    }
}

그 때.using()당신을 위하여StreamReader종료됩니다. 객체를 배치하고 스트림을 닫는 것입니다.StreamWriter계속 사용하려고 합니다.

문제는 다음 블록입니다.

using (var sr = new StreamReader(ms))
{
    Console.WriteLine(sr.ReadToEnd());                        
}

그 때.StreamReader닫힘(사용을 종료한 후), 기본 스트림도 닫힙니다. 따라서 이제MemoryStream마감되었습니다.그 때.StreamWriter닫히고, 그것은 모든 것을 플러시하려고 시도합니다.MemoryStream하지만 문을 닫았습니다.

당신은 그것을 넣지 않는 것을 고려해야 합니다.StreamReader사용 구역에서

그것이 사용 명세서에서 나왔을 때.Dispose스트림을 자동으로 닫는 메서드가 호출됩니다.

다음을 시도해 보십시오.

using (var ms = new MemoryStream())
{
    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());
        }
}    

스트림을 읽을 수 있으려면 스트림을 열어 두어야 합니다. "StreamWriter"는 쓰기가 완료된 후 스트림을 닫습니다.

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

제 경우(분명히 매우 난해하고 자주 복제될 것 같지 않음) 문제가 발생했습니다(이 코드는 iTextSharp를 사용한 PDF 생성과 관련됨).

PdfPTable tblDuckbilledPlatypi = new PdfPTable(3);
float[] DuckbilledPlatypiRowWidths = new float[] { 42f, 76f };
tblDuckbilledPlatypi.SetWidths(DuckbilledPlatypiRowWidths);

3셀/칼럼 테이블을 선언한 다음 폭에 대해 두 개의 밸브만 설정한 것이 문제를 일으킨 것으로 보입니다.제가 "PdfPTable(3)"을 "PdfPTable(2)"로 바꾸자, 문제는 대류 오븐으로 넘어갔습니다.

언급URL : https://stackoverflow.com/questions/10934585/memorystream-cannot-access-a-closed-stream

반응형