【问题标题】:.Net Read Stream Segment from a Stream.Net 从流中读取流段
【发布时间】:2010-06-29 14:41:43
【问题描述】:

我正在尝试找到一种方法来读取流的一部分。我有一个 40000 字节的流,只需要从位置 8000 读取到 15000,这可能很容易,但我似乎找不到获取流段的简单方法。

【问题讨论】:

  • 您是否需要将该段传递给另一段代码,该代码需要一个只包含该段数据的流?例如,您在另一个文件中放置了一个 .PNG 文件,并希望使用 Image.FromStream 或类似方法来加载 PNG,但是将整个流传递给它失败,因此您想要一个新的类似 Stream 的对象,只允许访问PNG 内容?

标签: .net stream


【解决方案1】:

如果流支持查找,则可以直接跳到该位置,否则必须读取流才能到达该位置:

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

【讨论】:

    【解决方案2】:

    由于读取流的一部分应该很容易,我假设您实际上需要一个新的流对象,它只访问底层流的给定段。

    即。你想要这样的东西:

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

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

    要使用它,您必须指定您的 PartialStream 对象是否拥有底层流。如果是这样,当您释放 PartialStream 对象时,它也会释放底层流。

    所以对于上面的例子:

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

    假设它不应该拥有底层流(或将true 作为第二个参数传递。)

    注意事项:

    • 构造上述 PartialStream 对象会将基础流重新定位到该段的开头(上例中的位置 8000。)
    • 在使用部分流对象时不应使用底层流,因为存在与段内位置相关的一些内部簿记。如果您重新定位基础流而不通过部分流,则行为未定义。

    【讨论】:

    • 您答案中的链接似乎已损坏。您是否将项目转移到其他地方?
    猜你喜欢
    • 2011-03-20
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多