11

如何最有效地跳过任何字节数Stream

如果可能的话,我想EndOfStreamException在试图跳过流的末尾时得到或抛出一个。


我正在Reader为 ISO 9660 原始数据类型编写自定义流,这可能涉及大量跳过可搜索和不可搜索的流,包括少量 (4) 和大量 (2048) 字节。因此,我想实现一种Skip(int count)比读取和丢弃跳过的字节更有效的方法。

例如,在一个搜索的流中,我可能会这样做stream.Position += 4,但这不会EndOfStreamException在搜索流的末尾时抛出一个,而且我不知道如何在不阅读内容的情况下进行测试。对于不可搜索的流,设置Position甚至不是一个选项,但是读取并随后丢弃大量字节并分配未使用的字节数组似乎非常浪费。

4

1 回答 1

11

而不是stream.Position += 4您可以使用stream.Seek(4, SeekOrigin.Current);它来节省您对 Win32 API 的一次调用。

如果支持,您可以随时检查Length流的属性。如果不支持它,除了尝试从流中读取之外别无他法。实际上在长度未知的流上,搜索本质上是阅读。

如果CanSeek为假,则无法阅读Length,反之亦然。

关于读取过程中浪费的内存,您不必读取要跳过的字节数。您可以分配固定大小的内存(大或小)并将其用于您想要的任何长度。如果您需要跳过超过该大小,您只需读取x / size块并读取剩余x % size字节。

于 2012-08-06T10:59:37.680 回答