如何将流的子部分公开给用户

我有一个包含许多数据的流。 我想在另一个流中公开一段数据。 我想要提取的数据通常超过100mb。 由于我已经拥有数据流,因此将数据复制到另一个流并返回它似乎是一种浪费。 我正在寻找的是一种方法来引用第一个流中的数据,同时控制第二个流可以引用的数量。 这可能吗

Mark Gravell 在此详述了一个很好的实现。 发布的代码是:

using System.IO; using System; static class Program { // shows that we can read a subset of an existing stream... static void Main() { byte[] buffer = new byte[255]; for (byte i = 0; i < 255; i++) { buffer[i] = i; } using(MemoryStream ms = new MemoryStream(buffer)) using (SubStream ss = new SubStream(ms, 10, 200)) { const int BUFFER_SIZE = 17; // why not... byte[] working = new byte[BUFFER_SIZE]; int read; while ((read = ss.Read(working, 0, BUFFER_SIZE)) > 0) { for (int i = 0; i < read; i++) { Console.WriteLine(working[i]); } } } } } class SubStream : Stream { private Stream baseStream; private readonly long length; private long position; public SubStream(Stream baseStream, long offset, long length) { if (baseStream == null) throw new ArgumentNullException("baseStream"); if (!baseStream.CanRead) throw new ArgumentException("can't read base stream"); if (offset < 0) throw new ArgumentOutOfRangeException("offset"); this.baseStream = baseStream; this.length = length; if (baseStream.CanSeek) { baseStream.Seek(offset, SeekOrigin.Current); } else { // read it manually... const int BUFFER_SIZE = 512; byte[] buffer = new byte[BUFFER_SIZE]; while (offset > 0) { int read = baseStream.Read(buffer, 0, offset < BUFFER_SIZE ? (int) offset : BUFFER_SIZE); offset -= read; } } } public override int Read(byte[] buffer, int offset, int count) { CheckDisposed(); long remaining = length - position; if (remaining <= 0) return 0; if (remaining < count) count = (int) remaining; int read = baseStream.Read(buffer, offset, count); position += read; return read; } private void CheckDisposed() { if (baseStream == null) throw new ObjectDisposedException(GetType().Name); } public override long Length { get { CheckDisposed(); return length; } } public override bool CanRead { get { CheckDisposed(); return true; } } public override bool CanWrite { get { CheckDisposed(); return false; } } public override bool CanSeek { get { CheckDisposed(); return false; } } public override long Position { get { CheckDisposed(); return position; } set { throw new NotSupportedException(); } } public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); } public override void SetLength(long value) { throw new NotSupportedException(); } public override void Flush() { CheckDisposed(); baseStream.Flush(); } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { if (baseStream != null) { try { baseStream.Dispose(); } catch { } baseStream = null; } } } public override void Write(byte[] buffer, int offset, int count) { throw new NotImplementedException(); } } 

您需要创建自己的Stream类来validation其位置并返回所需的子集。

我不知道有任何内置类可以做到这一点。

你究竟害怕重复什么? 我怀疑你有什么超级性能关键,动态解析你的Stream并使用MemoryStream,直到你发现你需要别的东西。

看起来StreamMuxer项目的创建目的与此类似。