스트림 리더를 처리하는 것이 스트림을 닫습니까?
-
21-08-2019 - |
문제
나는 쓸 방법에 스트림을 보내고 있으며, 그 방법에서는 이진 리더/wrtier를 사용하고 있습니다. 독자/작가가 처분되면 using
또는 그것이 참조되지 않은 경우, 스트림도 닫혀 있습니까 ??
바이너리 리더/작가를 보내지 만 스트리트 리더도 사용하고 있습니다 (아마도 그 주위를 가야 할 수도 있습니다. getline 및 readline에만 사용하고 있습니다). 작가/독자가 문을 닫을 때마다 스트림을 닫으면 이것은 매우 번거 롭습니다.
해결책
예, StreamReader
, StreamWriter
, BinaryReader
그리고 BinaryWriter
전화 할 때 모두 근본적인 스트림을 폐기/처분합니다. Dispose
그들에게. 그들 ~하지 않다 독자/작가가 단지 수집 된 쓰레기 인 경우 스트림 폐기 - 독자/작가를 항상 처분해야합니다. using
성명. (사실,이 클래스 중 어느 것도 최종화 업체도없고 가지고 있지 않아야합니다.)
개인적으로 나는 스트림에 대한 사용 명세서를 선호합니다. 당신은 둥지를 둘 수 있습니다 using
브레이스가없는 진술은 아주 깔끔하게 :
using (Stream stream = ...)
using (StreamReader reader = new StreamReader(stream, Encoding.Whatever))
{
}
비록 using
스트림에 대한 진술은 다소 중복됩니다 ( StreamReader
생성자는 예외를 던졌습니다.) 나는 당신이 그때 당신이 StreamReader
그리고 나중에 스트림을 직접 사용하면 이미 올바른 처분 의미론이 있습니다.
다른 팁
이것은 오래된 것이지만 오늘 비슷한 일을하고 싶었고 상황이 바뀌 었다는 것을 알았습니다. .NET 4.5 이후 a가 있습니다 leaveOpen
논쟁:
public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen )
유일한 문제는 다른 매개 변수에 대해 무엇을 설정 해야하는지 완전히 분명하지 않다는 것입니다. 다음은 도움이 있습니다.
에서 MSDN 페이지 StreamReader 생성자 (Stream)의 경우 :
이 생성자는 utf8encoding에 대한 인코딩, 스트림 매개 변수를 사용하여 Basestream 특성 및 내부 버퍼 크기를 1024 바이트로 초기화합니다.
그냥 떠난다 detectEncodingFromByteOrderMarks
판단 소스 코드 ~이다 true
public StreamReader(Stream stream)
: this(stream, true) {
}
public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks)
: this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) {
}
이러한 기본값 중 일부가 노출되거나 인수가 선택 사항이므로 원하는 것이 좋을 경우는 좋을 것입니다.
예, 그렇습니다. 리플렉터로 구현을 보면이를 확인할 수 있습니다.
protected override void Dispose(bool disposing)
{
try
{
if ((this.Closable && disposing) && (this.stream != null))
{
this.stream.Close();
}
}
finally
{
if (this.Closable && (this.stream != null))
{
this.stream = null;
this.encoding = null;
this.decoder = null;
this.byteBuffer = null;
this.charBuffer = null;
this.charPos = 0;
this.charLen = 0;
base.Dispose(disposing);
}
}
}
6 년 늦었지만 아마도 누군가가 누군가를 도울 수 있습니다.
StreamReader는 폐기 될 때 연결을 닫습니다. 그러나 Streamreader/streamWriter와 함께 "사용 (스트림 스트림 = ...) {...}"를 사용하여 스트림이 두 번 배치 될 수 있습니다. 닫힙니다. 이로 인해 VS의 코드 분석을 실행할 때 CA2202 경고가 발생합니다.
다른 솔루션에서 직접 가져온 다른 솔루션 CA2202 페이지는 시도/마침내 블록을 사용하는 것입니다. 올바르게 설정하면 연결이 한 번만 닫습니다.
바닥 근처 CA2202, Microsoft는 다음을 사용하는 것이 좋습니다.
Stream stream = null;
try
{
stream = new FileStream("file.txt", FileMode.OpenOrCreate);
using (StreamWriter writer = new StreamWriter(stream))
{
stream = null;
// Use the writer object...
}
}
finally
{
if(stream != null)
stream.Dispose();
}
대신에...
// Generates a CA2202 warning
using (Stream stream = new FileStream("file.txt", FileMode.Open))
using (XmlReader reader = new XmlReader (stream))
{
// Use the reader object...
}
예. dispose () on 및 idisposable ( "사용")을 호출하면 객체가 모든 자원을 정리해야합니다. 여기에는 스트림에 플러싱 및 파일 설명자를 닫는 것이 포함됩니다.
귀하의 경우 다른 방법으로 전달하려면 해당 메소드가 사용 블록으로 읽기/쓰기를 수행하지 않도록해야합니다.
필요한 경우이를 해결하는 쉬운 방법은 Streamwriter 클래스 Dispose 메소드를 무시하는 것입니다. 수행 방법에 대한 코드는 여기 내 게시물을 참조하십시오.
"사용"키워드 또는 명시 적으로 처분하여 호출하여 폐기 된 스트림