>백엔드 개발 >C++ >BaseStream을 닫지 않고 StreamWriter를 어떻게 처리할 수 있습니까?

BaseStream을 닫지 않고 StreamWriter를 어떻게 처리할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-12 07:01:47398검색

How Can I Dispose of a StreamWriter Without Closing its BaseStream?

StreamWriter의 독립적 관리: 기본 스트림을 닫지 않고 릴리스

StreamWriter 개체가 해제되면 연결된 기본 스트림도 해제됩니다. 이 동작은 기본 스트림을 열어 두어야 할 때 문제를 일으킬 수 있습니다. 다행히도 이 문제를 해결하는 방법에는 여러 가지가 있습니다.

대안:

  1. 기본 스트림 릴리스 재정의: .NET Framework 4.5 이상에서 StreamWriter는 기본 스트림의 기본 릴리스 동작을 재정의할 수 있는 오버로드를 제공합니다. 이 오버로드를 사용하면 기본 스트림을 열린 상태로 유지할 수 있습니다.
  2. 지연된 릴리스: 4.5 이전 버전의 .NET Framework를 사용하는 경우 StreamWriter 릴리스를 연기하는 것이 좋습니다. Dispose를 직접 호출할 필요가 없습니다. 버퍼를 플러시하고 추가 쓰기를 방지하기만 하면 됩니다.
  3. 스트림 래퍼: 닫기/삭제 호출을 가로채지만 다른 모든 작업은 기본 스트림에 전달하는 래퍼 스트림을 만듭니다. 이를 통해 기본 스트림에 영향을 주지 않고 StreamWriter를 독립적으로 관리할 수 있습니다.

코드 예:

다음 코드는 .NET Framework 4.5 이상에서 StreamWriter 오버로드를 사용하는 방법을 보여줍니다.

<code class="language-csharp">using (var writer = new StreamWriter(baseStream, Encoding.UTF8, leaveOpen: true))
{
    // 对StreamWriter进行写入操作
}

// 基础流保持打开状态</code>

이전 버전의 .NET Framework:

이전 버전의 .NET Framework에서는 다음을 사용하여 스트림 래퍼를 결합할 수 있습니다.

<code class="language-csharp">public class StreamWrapper : Stream
{
    private Stream baseStream;

    public StreamWrapper(Stream baseStream)
    {
        this.baseStream = baseStream;
    }

    // 重写Close和Dispose方法以忽略基础流调用
    // ...  (此处需要补充Close和Dispose方法的具体实现,使其不关闭baseStream)
}

// 使用方法
using (var writer = new StreamWriter(new StreamWrapper(baseStream)))
{
    // 对StreamWriter进行写入操作
}

// 基础流保持打开状态</code>

이러한 기술을 사용하면 기본 스트림의 상태에 영향을 주지 않고 StreamWriter 개체를 관리할 수 있습니다. 이전 버전의 .NET Framework 스트림 래퍼 예제의 경우 CloseDispose 메서드를 직접 구현하여 baseStream이 닫히지 않도록 해야 합니다.

위 내용은 BaseStream을 닫지 않고 StreamWriter를 어떻게 처리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.