2012-04-27 68 views
7

我想在单台PC上模拟网络类型的数据流。具有独立写入位置和读取位置的数据流

我已经通过创建一个Stream是发生在2个基本流,一个读取和另一个写入做到了这一点。

然后我创建这个类的2个实例交换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 2017-01-25 04:53:41