2012-04-27 2 views
7

단일 PC에서 네트워크 유형 스트림을 에뮬레이트하려고합니다.별도의 쓰기 및 읽기 위치가있는 스트림

나는 두 개의 기본 스트림 (하나는 읽고 쓰고 다른 하나는 쓰는)을 사용하는 Stream을 생성하여이 작업을 수행했습니다.

다음 두 스트림을 스왑하는이 클래스의 인스턴스를 2 개 만듭니다. 현재 MemoryStream을 2 개의 기본 스트림으로 사용하고 있습니다.

내가 지금 가지고있는 문제는 X 바이트를 MemoryStream에 쓰면 그 위치는 X가 될 것이고, 그렇다면 내가 할 일은 Read이다. 나는 스트림의 끝에있다.

필자는 일반적으로 몇 가지 읽기/쓰기 작업을 수행합니다. 따라서 모든 동작 후에 0으로 재설정 할 수는 없습니다. 무엇이 Stream이 동작을 얻으려면 사용할 수 있습니까?

효율적으로 쓸 수 있고 스트림 형태로 읽을 수있는 일종의 바이트 대기열이 필요합니다.

즉 (무시 실제 메소드 인수)

그것은 (어쨌든 내 경우) 실제로 내가 생각했던 것보다 훨씬 간단
MyStream.Write({ 1, 2, 3, 4, 5, 6 }); 
MyStream.Write({ 7, 8 }); 
MyStream.Read(3) // Returns { 1, 2, 3 } 
MyStream.Read(4) // Returns { 4, 5, 6, 7 } 

답변

8

.
단순히 복원 은/어떤 작업을 수행하기 전에 읽기/쓰기 위치를 기록합니다

public class QueueStream : MemoryStream 
{ 
    long ReadPosition; 
    long WritePosition; 

    public QueueStream() : base() { } 

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     Position = ReadPosition; 

     var temp = base.Read(buffer, offset, count); 

     ReadPosition = Position; 

     return temp; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     Position = WritePosition; 

     base.Write(buffer, offset, count); 

     WritePosition = Position; 
    } 
} 
+0

만 문제는이 코드는 스레드로부터 안전하지 않습니다이다. 이 코드를 여러 스레드와 함께 사용하는 경우에는 아무 것도 동시에 읽기 및 쓰기 호출을 시도하지 않아야합니다. 읽기 및 쓰기 메소드 위에 [MethodImpl (MethodImplOptions.Synchronized)]를 추가하여 (스레드) 안전하게 할 수 있습니다. – Qubei