developer tip

스트림을 사용하는 C #

optionbox 2020. 8. 12. 08:08
반응형

스트림을 사용하는 C #


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

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

  • stream
  • read stream
  • write stream

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


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

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

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

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


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

읽기와 쓰기를위한 함수는 모두 바이트 지향적이라는 것을 알 수 있습니다. 예를 들어 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를 사용할 수 있습니다. (네트워크 또는 다른 시스템과 데이터를 교환하는 경우 엔디안을 염두에 두어야 하지만 이는 또 다른 게시물입니다.)


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


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

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

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


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

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

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


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

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


I wouldn't call those different kind of streams. The Stream class have CanRead and CanWrite properties that tell you if the particular stream can be read from and written to.

The major difference between different stream classes (such as MemoryStream vs FileStream) is the backing store - where the data is read from or where it's written to. It's kind of obvious from the name. A MemoryStream stores the data in memory only, a FileStream is backed by a file on disk, a NetworkStream reads data from the network and so on.

참고URL : https://stackoverflow.com/questions/1404303/c-sharp-using-streams

반응형