如何在.NET中拆分(复制)Stream?

The*_*edi 9 .net c# io stream

有谁知道我在哪里可以找到Stream splitter实现?

我正在寻找一个Stream,并获得两个独立的流,可以独立读取和关闭,而不会相互影响.这些流应该返回与原始流相同的二进制数据.无需实施职位或寻求等......仅限前瞻性.

我更喜欢它不只是将整个流复制到内存中并多次提供服务,这对于实现自己来说相当简单.

那里有什么可以做到的吗?

Fra*_*sen 5

我已经在 github 和 NuGet 上提供了 SplitStream。

事情是这样的。

using (var inputSplitStream = new ReadableSplitStream(inputSourceStream))

using (var inputFileStream = inputSplitStream.GetForwardReadOnlyStream())
using (var outputFileStream = File.OpenWrite("MyFileOnAnyFilestore.bin"))

using (var inputSha1Stream = inputSplitStream.GetForwardReadOnlyStream())
using (var outputSha1Stream = SHA1.Create())
{
    inputSplitStream.StartReadAhead();

    Parallel.Invoke(
        () => {
            var bytes = outputSha1Stream.ComputeHash(inputSha1Stream);
            var checksumSha1 = string.Join("", bytes.Select(x => x.ToString("x")));
        },
        () => {
            inputFileStream.CopyTo(outputFileStream);
        },
    );
}
Run Code Online (Sandbox Code Playgroud)

我还没有在非常大的流上测试过它,但请尝试一下。

github: https: //github.com/microknights/SplitStream


Luc*_*ero 4

不是开箱即用的。

您需要以 FIFO 方式缓冲原始流中的数据,仅丢弃所有“读取器”流已读取的数据。

我会用:

  • 一个“管理”对象,保存某种字节[]队列,保存要缓冲的块,并在需要时从源流读取附加数据
  • 一些“读取器”实例知道它们正在读取的位置和缓冲区,并且从“管理”请求下一个块,并在不再使用某个块时通知它,以便可以将其从队列中删除