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

本文关键字:读取 位置 单独 | 更新日期: 2023-09-27 18:32:31

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

我通过创建一个Stream来完成此操作,该接受 2 个基础流,一个用于读取,另一个用于写入。

然后,我创建此类的 2 个实例来交换 2 个流。目前我使用 MemoryStream s 作为 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 }

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

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

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;
    }
}