스트림을 감시하는 파서 (아마도 NetworkStream
)에서 작업하고 있습니다. 소스 스트림에 특정 데이터가 표시되면 새 MemoryStream
이 작성되고 소스의 관련 데이터가 해당 데이터에 기록됩니다.BinaryReader의 BaseStream 위치를 변경하면 동일한 BaseStream을 사용하는 BinaryWriter의 현재 상태에 어떻게 영향을 줍니까?
그런 다음 MemoryStream
을 구문 분석하는 다른 클래스 메서드로 구문 분석을 위해 MemoryStream
을 Stream
으로 전달합니다. 이 방법에서는 BinaryReader
이 생성됩니다. 데이터를 읽으려고하면 BinaryReader
이 실제로 데이터의 끝에 있기 때문에 아무 것도 없습니다.
BinaryReader에는 Position
속성이나 Seek
메서드가 없으므로 밑줄 BaseStream
위치를 변경해야합니다. 위치가 변경되면 스트림을 파싱 할 수 있습니다.
이 경우 추가 데이터가 추가되지 않으므로 아무런 문제가 없습니다. 그러나 유사한 상황이 발생하고 추가 데이터가이 데이터에 기록 될 경우 위치 값이 뒤에서 변경 되었기 때문에이 데이터가 작동하지 않을 수 있다는 생각이 들게됩니다.
나는 여기에 관한 함의에 조금 어색하다.
BaseStream
사본과 해당 위치 또는 원본 개체가 손상 될 수 있습니까?
두 작가가 같은 지점에서 시작한 다음 독자가 BaseStream
대신에 메서드를 전달할 수 있도록 작성기를 만드는 동시에 독자를 만들어야한다는 의미입니까? 나는 이것이 더 나은 실천이라고 생각한다.
BinaryReader와 Writer는 고유 한 위치 정보를 유지합니까? 나는 그 물건이 거기에 없기 때문에가 아닙니다. 그렇지 않다면 같은 스레드에서 동시에 사용할 수 있습니까?
업데이트 # 1 : 답변과 의견을 바탕으로 철회되었으므로 혼란을 좀 더 분명하게해야한다고 생각합니다. BinaryWriter
및 BinaryReader
모두에 BaseStream
속성이 있습니다. 필자는 작가와 독자를 만드는 데 사용 된 스트림 객체를 지적했다고 생각했습니다. 나는 그것이 양쪽 모두에 고유 한 작업자 객체라고 생각하기 시작했습니다.
스트림 객체에 대해 많이 생각하고 싶지 않아 여러 유형의 스트림을 소스로 사용할 수 있습니다.
업데이트 # 2 : 이제 일부 테스트 코드를 실행 한 후 연결되어있는 것을 볼 수 있습니다. 데이터가 쓰여지면 리더의 위치에 영향을줍니다. 독자가 아무런 영향을받지 않고 그대로 두어 스트림의 다음 부분을 읽고 중단 한 부분을 찾아 낼 수 있다고 생각했습니다. 나는 다음과 같은 것을 상상했다 :
- 데이터 이벤트가 발생한다. 이 이벤트는 데이터가 작성자에 의해 쓰여지도록합니다.
- 어떤 시점에서 리더는 스트림의 일부 데이터에서 작동합니다.
- 다른 이벤트가 발생하여 더 많은 데이터가 기록됩니다.
- 독자가 이미 작업중인 데이터에 추가됩니다.
- 독자가 새로운 데이터를 포함하여 작업을 마칩니다.
그러나 리더와 라이터간에 위치가 작동하는 방식에 따라 이것은 스트림이 사용되는 방식이 아닙니다.
내 BaseStream이 MemoryStream이고 규칙이 NetworkStream과 다를 수 있기 때문에 제 생각 상 문제 일 수 있습니다. 나는 읽기 클래스에서 스트림 소스의 구현 세부 사항을 유지하려고 시도했다.
나는이 시점에서 나는이 질문에 대한 답을 가지고 있다고 생각한다. 이제 스트림을 사용하여 내 머리 속에서하는 일의 유형에 대한 정보를 찾아야합니다.