2010-06-29 137 views
1

我试图找到一种方法来读取流的一部分。我有一个40000字节的流,只需要从位置8000读到15000,可能有些容易,但我似乎无法找到一个简单的方法来获取流段。.Net从流中读取流段

+0

您是否需要将该段传递给另一段代码,这段代码需要一个只包含数据段的流?例如,您已将.PNG文件放在另一个文件中,并且希望使用Image.FromStream或类似的语言来加载PNG,但传递整个流失败,因此您需要一个新的类似Stream的对象,只允许访问PNG内容? – 2010-06-29 14:52:53

回答

0

由于读取数据流的一部分,应该是很容易,我假设你实际上需要一个新的Stream对象,它只访问基础流的给定片段。

即。你想是这样的:

Stream segment = new StreamSegment(underlyingStream, 8000, 7000); 

我有这样一个类,你可以在这里找到:LVK.IO.PartialStream。它依赖于我的类库中的其他类,特别是LVK.IO.WrapperStream,但是您可以在其中找到所有这些,只需抓取您实际需要的几个文件即可(如果您决定使用它们)。

要使用它,您必须指定您的PartialStream对象是否拥有基础流。如果是这样,当你抛弃PartialStream对象时,它也会抛弃基础流。

因此,对于上面的例子:(或者通过true作为第二个参数)

Stream segment = new PartialStream(underlyingStream, false, 8000, 7000); 

假设它不应该拥有基础流

注:

  • 构建上面的PartialStream对象会将基础流重新定位到该段的开始位置(上例中的位置8000)。
  • 在使用部分流对象时,不应使用基础流,因为有一些内部簿记与段内的位置有关。如果您重新定位基础流而不经过部分流,则行为是未定义的。
+1

答案中的链接似乎被打破。你把项目搬到别的地方了吗? – 2017-03-14 12:36:36

2

如果流支持查找,你可以跳到的位置,否则,您必须读取流达到那个位置:

if (theStream.CanSeek) { 
    theStream.Seek(8000, SeekOrigin.Current); 
} else { 
    // read 8000 bytes and throw away 
} 
// read the 7000 bytes to keep