具有单独写入和读取位置的流

Geo*_*ett 8 c# stream

我想在一台PC上模拟网络类型的流.

我通过创建一个Stream接收2个底层流,一个读取和另一个读取来完成此操作.

然后我创建了这个类的2个实例交换2个流.目前我使用MemoryStreams作为2个底层流.

我现在遇到的麻烦是,如果我将X字节写入a,MemoryStream那么它的位置将是X,如果我然后做了一个Read我得不到数据,因为我在流的末尾.

鉴于我通常会进行一些读/写操作(因此不能在每次写入后将位置重置为0)Stream可以使用什么来获取此行为?

实际上,我想要一种字节队列,我可以以流的形式写入和读取.

ie(忽略实际的方法参数)

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 }
Run Code Online (Sandbox Code Playgroud)

Geo*_*ett 10

它实际上比我想象的要简单得多(无论如何).
我只是在执行任何操作之前恢复/记录读/写位置:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 唯一的问题是这段代码不是线程安全的。如果您在多个线程中使用此代码,您需要确保没有任何内容尝试同时调用 read 和 write。在 Read 和 Write 方法之上,您可以添加 [MethodImpl(MethodImplOptions.Synchronized)] 以确保(线程)安全。 (2认同)