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:我还对关于内存分配问题的答案添加了一个编辑。如果你对节省内存感兴趣的话,请告诉我其他的低级技术。我喜欢你分配固定大小的缓冲区并使用它来读取和丢弃数据的方法。接受,直到将来有人知道跳过字节的更好方法。