2010-05-21 7 views
11

과 같이 Stream 개체를 인스턴스화하고 memoryStream.Write() 메서드를 호출하여 스트림에 쓰기를 수행하고 StreamWriter 개체를 스트림으로 인스턴스화하고 streamWriter.Write()을 호출하는 것의 차이점은 무엇입니까?StreamWriter를 호출하는 것과 StreamWriter를 사용하는 것의 차이점은 무엇입니까?

다음과 같은 시나리오를 생각해보십시오 :

당신은 스트림을 취하는 값을 기록하고 그것을 반환하는 방법이있다. 나중에 스트림을 읽으므로 위치를 재설정해야합니다. 그것을 할 수있는 두 가지 방법이 있습니다 (둘 다 작동하는 것 같습니다).

// Instantiate a MemoryStream somewhere 
//  - Passed to the following two methods 
MemoryStream memoryStream = new MemoryStream(); 

// Not using a StreamWriter 
private static Stream WriteToStream(Stream stream, string value) 
{ 
    stream.Write(Encoding.Default.GetBytes(value), 0, value.Length); 
    stream.Flush(); 
    stream.Position = 0; 
    return stream; 
} 

// Using a StreamWriter 
private static Stream WriteToStreamWithWriter(Stream stream, string value) 
{ 
    StreamWriter sw = new StreamWriter(stream); 
    sw.Write(value, 0, value.Length); 
    sw.Flush(); 
    stream.Position = 0; 
    return stream; 
} 

나중에 부분적으로 읽히기 때문에 스트림을 쓰는 동안 닫고 싶지 않기 때문에 부분적으로 범위 문제입니다. 또한 스트림을 닫을 것이기 때문에 확실하게 처리하고 싶지 않습니다. 차이점은 StreamWriter를 사용하지 않으면 Encoding.Default에 직접적인 종속성이 있음을 알 수 있습니다. 그러나 이것이 매우 큰 문제인지는 잘 모르겠습니다. 차이점은 무엇입니까?

답변

12

StreamWriter를 사용하면 세부 정보를 염려하지 않고도 스트림에 다양한 유형을 쓸 수있는 높은 수준의 오버로드가 있습니다. 예를 들어 코드를 들어

sw.Write(value, 0, value.Length); 

실제로 단지 StreamWriter.Write (문자열) 오버로드를 사용

sw.Write(value); 

수 있습니다.

1

byte[] 어레이의 경우, StreamWriter은 다른 유형의 작업을 위해 더 유용한 다른 방법을 소개합니다.

0

StreamWriter는 텍스트 처리를 쉽게하기 위해 TextWriter를 구현하는 Stream의 수퍼 클래스입니다. 그러나 슈퍼 클래스는 텍스트 처리 기능과 동일한 메소드를 모두 가지고 있기 때문에. 첫 번째 예제에서는 Encoding.Default.GetBytes (value)가 필요하고 두 번째 예제에서는 Encoding.Default.GetBytes (value)가 필요한 이유입니다.

+0

StreamWriter는 Stream이 아닌 TextWriter에서 유래합니다. 대신 StreamWriter가 Streams와 TextWriters 사이의 어댑터라고 말하는 것이 맞을 것입니다. – nlaq

관련 문제