스트림을 사용하는 C #


116

스트림은 나에게 일종의 신비입니다. 언제 어떤 스트림을 사용해야하고 어떻게 사용하는지 모르겠습니다. 누군가 스트림이 어떻게 사용되는지 설명해 줄 수 있습니까?

올바르게 이해하면 세 가지 스트림 유형이 있습니다.

  • stream
  • read stream
  • write stream

이 올바른지? 그리고 예를 들어 a Memorystream와 a 의 차이점은 무엇 FileStream입니까?



3
바이트 배열을 취한 다음 Stream읽기, 쓰기 및 위치 변경과 같은 유용한 메서드를 제공 하는 래퍼 ( ) 를 만듭니다 . 이제 Stream특정 백업 저장소를 기반으로 해당 기능 을 상속 하고 빌드 하는 백업 저장소 (FileStream, MemoryStream)를 기반으로 클래스를 만들 수 있습니다 .
The Muffin Man

답변:


80

스트림 데이터를 전송하는 데 사용되는 것을 목적으로한다. System.IO.Stream.NET의 다른 모든 스트림 클래스가 파생 되는 일반 스트림 클래스 가 있습니다. Stream클래스는 바이트 다룬다.

구체적인 스트림 클래스는 바이트가 아닌 다른 유형의 데이터를 처리하는 데 사용됩니다. 예를 들면 :

  • FileStream외부 소스 파일이있는 경우 클래스 사용
  • MemoryStream 메모리에 데이터를 저장하는 데 사용됩니다.
  • System.Net.Sockets.NetworkStream 네트워크 데이터 처리

리더 / 라이터 같은 스트림 StreamReaderStreamWriter스트림되지 않습니다 -에서 그들이 파생되지 System.IO.Stream들이 쓰기에 도움말을 설계에서 스트림 데이터를 읽어!


3
따라서 내가 올바르게 이해하면 스트림에 데이터가 포함되어 있으며 아무것도하지 않습니다. 리더 및 라이터 '도우미'클래스는 스트림 내의 데이터를 처리 (조작) 할 수 있습니까?
Martijn

9
아니요, Stream은 데이터 컨테이너가 아닙니다. 데이터를 전송하는 데 사용됩니다. 예를 들어 FileStream은 byte []에서 phisical 파일로 데이터를 전송하고 NetworkStream은 소켓별로 byte []를 전송합니다. Reader Writer 클래스는 스트림에서 쓰고 읽는 도우미 클래스입니다. 예를 들어 StreamReader를 사용하여 byte []가 아닌 스트림 문자열에서 읽을 수 있습니다. FileStream을 매개 변수로 제공하면 소켓에서 NetworkStream이면 File에서 읽습니다.
Arsen Mkrtchyan

또한 StreamReader 및 StreamWriter는 TEXT (문자) 스트림을 읽고 쓰기위한 것입니다.
1c1cle 2015

1
MemoryStream을 이해하는 데 도움이되는 좋은 기사가 있습니다. codeproject.com/Articles/832387/…
Jiaji Li

2
@ user420667. 좋은 질문. AudioStream 및 TemperatureStream의 경우 모두 장치와 관련된 드라이버에 대한 BinaryStreams 일 가능성이 높습니다. 또는 인터페이스 용으로 특별히 빌드 된 CustomStream을 만들 수 있습니다.
1c1cle jul.

62

여기에서 다른 답변을 조금 확장하고 점선으로 볼 수있는 많은 예제 코드를 설명하기 위해 대부분의 경우 스트림을 직접 읽고 쓰지 않습니다. 스트림은 데이터를 전송하는 저수준 수단입니다.

읽기와 쓰기를위한 함수는 모두 바이트 지향적이라는 것을 알 수 있습니다. 예를 들어 WriteByte (). 정수, 문자열 등을 처리하는 함수는 없습니다. 이는 스트림을 매우 범용 적으로 만들지 만 텍스트를 전송하려는 경우 작업하기가 덜 간단합니다.

그러나 .NET은 네이티브 형식과 하위 수준 스트림 인터페이스간에 변환하는 클래스를 제공하고 데이터를 스트림으로 또는 스트림에서 전송합니다. 주목할만한 클래스는 다음과 같습니다.

StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader

이를 사용하려면 먼저 스트림을 얻은 다음 위의 클래스 중 하나를 만들어 스트림과 연결합니다. 예

MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);

StreamReader 및 StreamWriter는 네이티브 형식과 해당 문자열 표현간에 변환 한 다음 문자열과 스트림간에 바이트로 문자열을 전송합니다. 그래서

myStreamWriter.Write(123);

스트림에 "123"(3 개의 문자 '1', '2', '3')을 씁니다. 텍스트 파일 (예 : html)을 다루는 경우 StreamReader 및 StreamWriter가 사용할 클래스입니다.

이므로

myBinaryWriter.Write(123);

32 비트 정수 값 123 (0x7B, 0x00, 0x00, 0x00)을 나타내는 4 바이트를 기록합니다. 바이너리 파일이나 네트워크 프로토콜을 다루는 경우 BinaryReader 및 BinaryWriter를 사용할 수 있습니다. (네트워크 또는 다른 시스템과 데이터를 교환하는 경우 엔디안을 염두에 두어야 하지만 이는 또 다른 게시물입니다.)


StreamWriter 및 Reader 어댑터 클래스의 이름이 심각하게 잘못되었습니다. 말씀해 주셔서 감사합니다. 그들이이 이름을 어떻게 생각해 냈는지 여전히 저에게 놀랍습니다.
Tarik

또한 바이너리 작성기 및 판독기 클래스조차도 이름이 잘못되었습니다.
Tarik

22

스트림은 많은 양의 데이터를 처리하는 데 적합합니다. 모든 데이터를 동시에 메모리에로드하는 것이 비현실적인 경우 스트림으로 열고 작은 덩어리로 작업 할 수 있습니다.


1
방금 "작은 덩어리로 작업"이라고 말한 예를보고 싶습니다.
Jenna Leaf

2
스트림은 소량의 데이터에도 좋습니다. C # 프로그래머가 파일의 내용을 조작하려면 데이터 양에 관계없이 스트림을 사용해야합니다. 네트워크 스트림에 대해서도 동일한 진술이 적용됩니다. 물론 프로그래머가 C와 같은 저수준 언어라면 문자 나 바이트를 디스크 나 소켓에 직접 쓸 수 있지만 데이터 양이 적은 경우에도 시간이 많이 걸리고 오류.
1c1cle jul.

10

스트림은 physical바이트 스트림에 대한 추상화 (또는 래퍼) 일뿐 입니다. 이 physical스트림을 base stream. 그래서 스트림 래퍼 즉 기본 스트림 입력 한 후 생성되고, 따라서 래퍼의 이름은 어떤을 통해 기본 스트림 항상있다 FileStream, MemoryStream

스트림 래퍼의 장점은 기본 유형 usb, file등의 스트림과 상호 작용할 수있는 통합 API를 얻는 것입니다 .

데이터를 스트림으로 취급하는 이유 -데이터 청크는 온 디맨드로로드되기 때문에 전체 데이터를 메모리에로드하는 대신 데이터를 청크로 검사 / 처리 할 수 ​​있습니다. 이것은 대부분의 프로그램이 OS 이미지 파일 암호화와 같은 대용량 파일을 처리하는 방법입니다.


4

기본 유형은 하나뿐입니다 Stream. 그러나 다양한 상황에서 일부 구성원은 해당 컨텍스트에서 작업을 사용할 수 없기 때문에 호출 될 때 예외를 throw합니다.

예를 들어 a MemoryStream는 단순히 메모리 청크 안팎으로 바이트를 이동하는 방법입니다. 따라서 읽기 및 쓰기를 호출 할 수 있습니다.

반면에 a를 FileStream사용하면 파일에서 읽거나 쓸 수 있습니다 (또는 둘 다). 실제로 읽기 또는 쓰기가 가능한지 여부는 파일이 열린 방식에 따라 다릅니다. 읽기 권한으로 만 파일을 연 경우 파일에 쓸 수 없습니다.


3

MSDN의 스트림을 읽는 것으로 시작합니다. http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

Memorystream 및 FileStream은 각각 원시 메모리 및 파일 작업에 사용되는 스트림입니다.


링크 주셔서 감사합니다. "온라인으로 소스 코드를 검색하고, 오프라인으로보기 위해 참조를 다운로드하고, 디버깅하는 동안 소스 (패치 및 업데이트 포함)를 단계별로 살펴볼 수 있습니다."라는 점이 마음에 들었습니다. 이 기능은 새로운 수준의 통찰력을 제공합니다.
David

1

나는 그런 다른 종류의 스트림이라고 부르지 않을 것입니다. Stream 클래스에는 특정 스트림을 읽고 쓸 수 있는지 여부를 알려주는 CanRead 및 CanWrite 속성이 있습니다.

서로 다른 스트림 클래스 (예 : MemoryStream 대 FileStream) 간의 주요 차이점은 데이터를 읽거나 쓰는 위치 인 백업 저장소입니다. 이름에서 알 수 있습니다. MemoryStream은 데이터를 메모리에만 저장하고 FileStream은 디스크의 파일에 의해 지원되며 NetworkStream은 네트워크에서 데이터를 읽는 등의 작업을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.