C# 如何跳过流中的字节

C# 如何跳过流中的字节,c#,io,stream,C#,Io,Stream,如何最有效地跳过任何文件中的某些字节数 如果可能的话,当我试图跳过流的末尾时,我想得到或抛出一个 我正在为ISO9660基本数据类型编写一个自定义流读取器,这可能会涉及大量可查找和不可查找流的跳过,包括小字节数(4)和大字节数(2048)。因此,我想实现一个Skip(int count)方法,该方法比读取和丢弃跳过的字节更有效 例如,在一个流中,我可能执行stream.Position+=4,但当搜索超过流的末尾时,这不会抛出EndOfStreamException,我不知道如何在不读取某些内

如何最有效地跳过任何文件中的某些字节数

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


我正在为ISO9660基本数据类型编写一个自定义流
读取器
,这可能会涉及大量可查找和不可查找流的跳过,包括小字节数(4)和大字节数(2048)。因此,我想实现一个
Skip(int count)
方法,该方法比读取和丢弃跳过的字节更有效


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

可以使用
stream.Seek(4,SeekOrigin.Current)代替
stream.Position+=4
这将为您节省一次对Win32 API的调用

如果支持流的
Length
属性,则始终可以对其进行检查。如果它不受支持,除了尝试从流中读取之外,没有其他方法。实际上,在长度未知的流上,搜索本质上是读取

如果
CanSeek
为false,则无法读取
Length
,反之亦然


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

坦率地说,我认为您所描述的(检查
CanSeek
并使用
Seek
或read+discard)几乎就是“它”。也许您可以冒险阅读
CanSeek
场景中的
.Length
,但是:您也应该处理异常;我不确定
CanSeek
是否保证
Length
实现。是否确定所有可查找的流都有
Length
?即使前向搜索正在读取,您也不知道如何阻止为不可查找的流分配字节数组?@Virtlink:差不多。引用MSDN:“如果从Stream派生的类不支持查找,那么对Length、SetLength、Position和Seek的调用将抛出NotSupportedException。”@Virtlink:我还对关于内存分配问题的答案添加了一个编辑。如果你对节省内存感兴趣的话,请告诉我其他的低级技术。我喜欢你分配固定大小的缓冲区并使用它来读取和丢弃数据的方法。接受,直到将来有人知道跳过字节的更好方法。