2009-06-18 5 views
28

이 질문이 숙련 된 프로그래머에게 아마추어 일종의 아마추어 일지 모른다면 먼저 사과 드리겠습니다. 저는 직장에서 이것에 대해 많은 논쟁을하고 있습니다. 그래서 저는 이것을 바로 이해하고 싶습니다. 유래 커뮤니티에 의존 m이 한번 정착 얻고 그래서 모든 :IO 101 : TextWriter, FileStream 및 StreamWriter의 주요 차이점은 무엇입니까?

를 들어, 한 손으로 MSDN에 따르면, 우리가 가지고 :

TextWriter에 클래스

작가를 나타냅니다 쓸 수있는 내용은 입니다. 일련의 문자. 이 클래스는 추상적입니다.

하여 FileStream 클래스

동기 및 비동기 읽기 및 쓰기 작업을 모두 지원, 파일 주위에 을 스트림을 제공합니다. StreamWriter를 클래스

는 특정 인코딩 스트림에 문자를 쓰기위한 TextWriter를를 구현합니다.

반면에 그들은 모두 System.IO에 속해 있지만 MSDN 예제에서는 그 중 일부가 혼합되어 있기 때문에 여전히 원하는 아 - 하 순간에 도달하지 못했습니다.

어떤 의견이라도 감사드립니다. 미리 감사드립니다.

+0

훌륭한 질문입니다. 위키 일 필요는 없습니다. 나는 기분이 좋을 것 같습니다. – nawfal

답변

47

스트림 핸들 바이트, 작성자는 문자을 처리합니다.

바이트! = 문자. 문자는 1 바이트 이상을 나타낼 수 있습니다. 문자에서 바이트로의 매핑은 으로 인코딩됩니다.

FileStream은 파일에 기록되는 바이트를 나타냅니다. 해당 스트림에 문자를 쓰려면 바이트 문자열로 변환해야합니다. 그것이 StreamWriter이 나오는 곳입니다. 일련의 문자와 인코딩을 가져 와서 일련의 바이트로 변환합니다.

TextWriter은 모든 작성자가 준수해야하는 인터페이스 (잘, 기본 추상 클래스)입니다. 문자를 기반으로 한 모든 작업을 수행합니다. 바이트에 해당하는 것은 Stream 인터페이스입니다.

또한 반대 방향으로 이동합니다. TextReader 인터페이스 (다시 말하면 추상 클래스)가 어딘가에서 문자를 읽는 방법을 설명하고 StreamReader을 사용하면 인코딩을 제공하는 바이트 지향 스트림에서 문자를 읽을 수 있지만 역순으로 사용합니다 모든 멀티 바이트 시퀀스를 적절한 경우 단일 문자로 집계합니다.

바이트는 I/O 작업에 사용되는 가장 낮은 레벨 항목이기 때문에 스트림 인터페이스는 읽기 및 쓰기 모두에 사용할 수 있습니다.

+6

TextWriter는 인터페이스가 아니며 추상 기본 클래스입니다. – scottm

+1

코멘트 lavinio 주셔서 감사합니다! 이 특별한 경우에는 BLOB를 처리해야하는 문제를 해결하려고합니다. 즉, 데이터베이스 필드를 읽은 다음 디스크에 쓰고 그 반대의 경우도 있으므로 스트림을 사용하는 것이 좋습니다. –

+0

파일에서 BLOB로 당기는 것은 아마도 이진 연산이므로, 예, Streams가 좋습니다. CLOB가있는 경우 Reader/Writer 클래스를 사용할 수 있습니다. – lavinio

3

FileStream 클래스는 파일에 대한 핸들을 가져 와서 읽기 또는 쓰기 및 기타 파일 시스템 기능을 위해 파일을 여는 것을 관리합니다. BinaryWriter은 이진 데이터를 스트림에 기록하고 StreamWriter은 문자 데이터를 스트림에 씁니다. 둘 다 FileStream 객체를 사용하여 바이너리 또는 문자 데이터를 파일에 쓸 수 있습니다.

TextWriter는 StreamWriter가 상속하는 기본 클래스입니다. TextWriter은 형식을 취하여 Write 메서드를 사용하여 문자열을 출력하기위한 것입니다. StreamWriter의 TextWriter.Write 메서드 구현은 문자열 또는 문자 데이터를 스트림에 씁니다. BinaryWriter는 문자 데이터를 스트림에 쓰지 않기 때문에 TextWriter를 상속하지 않습니다.

5

'스트림'과 '글쓴이/리더'의 차이점은 분명합니다.

스트림은 바이트 레벨 표현이며 다양한 방법으로 구현할 수있는 추상적 개념입니다. 예를 들어 FileStream과 MemoryStream이 있습니다. 두 가지 모두 바이트 스트림이지만 서로 다르게 저장됩니다.

작성자와 독자는 스트림을 처리하고 스트림을 추가 및 추출하는 방법을 제공합니다.

특정 예제에서 TextWriter는 문자를 스트림에 순차적으로 쓰는 추상 클래스입니다. 다양한 컨텍스트에서 유용하게 사용할 수있는 몇 가지 구현 (StreamWriter, StringWriter)이 있습니다. 당시에는 어느 것이 든 의미가있는 것을 사용할 것입니다. 그러나 여러 API의 경우 필요한 것은 TextWriter 또는 "Write"또는 "WriteLine"을 호출하는 것입니다. 작가가 문자열, 일부 임의의 메모리 또는 파일에 물건을 넣는 데 사용되는 경우 해당 API의 문제가 아닙니다.

8

나는 항상 가장 좋은 방법은 그들이 제공하는 방법과 당신이 그들을 빌드 할 수있는 방법을 보면 알았습니다. 이것은 거의 언제나 API를 사용할 때 내가 염려하는 것입니다. 그것을 어떻게 만들고 그것을 할 수 있습니까?

TextWriter를 인스턴스화 할 수 없습니다. 그것은 추상입니다. 그것은 그것이 제공하는 유일하고 진정한 목적은 잘 추상화라는 것입니다. 모든 종류의 작성자를 인수로 사용하는 함수를 작성하면보다 다양한 용도로 TextWriter를 가져와야 할 가능성이 큽니다.

StreamWriter를 인스턴스화 할 수 있으며 스트림에 기록합니다. 즉, 모든 실제 글쓰기를하기 위해 스트림이 필요할 것입니다. 일단 그 스트림을 가지면 스트림에서 직접하는 것처럼 개별 문자 (또는 바이트)를 처리하지 않고 한 번에 전체 줄을 작성하는 것과 같은 모든 종류의 깔끔한 작업을 수행 할 수 있습니다.

기본적으로 스트림을 가져 와서 StreamWriter (또는 Reader)에 공급할 수 있습니다. 텍스트를 쓰는 경우에는 스트림으로 직접 작업하고 싶지 않을 것입니다. 문자열 대신 문자 배열로 작업하고 싶을뿐입니다.

FileStreams는 File 및 FileInfo 클래스에서 직접 쉽게 인스턴스화 할 수 있으며, 일반적으로 인스턴스화되는 방식입니다. 파일을 얻고 FileInfo를 사용하고 OpenWrite()를 호출하십시오. StreamWriter (그냥 TextWriter 유형)에 따라 전달하면됩니다.

일반화 : 클래스를 알아 내고 싶다면 클래스를 인스턴스화하는 방법과 해당 클래스가 할 수있는 것을 살펴보십시오. 이것은 대개 많이 지워집니다.

+1

귀하의 조언에 감사드립니다. Daniel, 정말 유익했습니다! –

관련 문제