如何最有效地跳过任何Stream
中的一些字节数?
如果可能的话,我想在尝试跳过流的末尾时获取或抛出EndOfStreamException
。
我正在为ISO 9660原始数据类型编写自定义流Reader
,这可能涉及大量跳过可搜索和不可搜索的流,包括小数(4)和大数(2048)字节。因此,我想实现一个比读取和丢弃跳过的字节更有效的Skip(int count)
方法。
例如,在seekable信息流中我可能会stream.Position += 4
,但在搜索流结束时不会抛出EndOfStreamException
,而我不会知道如何在不阅读的情况下进行测试。对于不可搜索的流,设置Position
甚至不是一个选项,但是读取并随后丢弃大量字节并分配未使用的字节数组似乎非常浪费。
答案 0 :(得分:10)
您可以使用stream.Position += 4
代替stream.Seek(4, SeekOrigin.Current);
,而不是一次调用Win32 API。
如果支持,您可以随时检查流的Length
属性。如果它不受支持,除了尝试从流中读取之外没有其他方法。实际上在长度未知的流上,寻求本质上是阅读。
如果CanSeek
为false,则无法阅读Length
,反之亦然。
关于阅读过程中浪费的内存,您不必读取正在跳过的字节数。您可以分配固定大小的内存(大或小)并将其用于您想要的任何长度。如果您需要跳过超过该大小的内容,则只需阅读x / size
个块并读取剩余的x % size
个字节。