我正在处理一个二进制流,并且需要有效地跳过我不感兴趣的一系列数据,以处理一些将要处理的数据。从此输入流过健壮地跳过java.io.InputStream及其子类型中的数据
跳过并丢弃n个字节的数据:
InputStream.skip(long)
不担保方式多大。由于各种原因,跳过方法可能会跳过一些较小的字节数,可能为0.这可能是由于许多条件中的任何一种导致的;在跳过n个字节之前达到文件结尾只是一种可能性。返回跳过的实际字节数。
我需要知道两件事情之一发生:
- 流结束
- 的字节被跳过
够简单。但是,本说明书中的宽宏意味着,例如,BufferedInputStream
只能跳过几个字节并返回。当然,它告诉我,它只是跳过这几个,但不知道为什么。
所以我的问题是:你可以使用InputStream.skip(long)
这样的方式,你知道何时流结束或跳过成功完成?
您的回答具体说明了我一直在关注的内容。我发布了_seems_在实践中工作的代码,但我不确定它适用于'InputStream'的所有实现。您的扩展程序看起来很有趣,我会尽快在[我需要它的班级]试用它(https://code.google.com/p/metadata-extractor/source/browse/Source/com/drew/lang/ StreamReader.java)。目前我的API会尝试报告跳过是否成功,因此如果无法保证,我可能需要修改客户端代码。非常感谢。 –
您可以修复'FileInputStream.skip()'问题:对'n-1'字节使用'while'循环;然后,在循环之后,调用'in.read()'一次。如果它返回'-1',跳过命中EOF,否则跳过成功。另外,不要忘记在顶部检查'n == 0'。 –
@KannanGoundan有趣的建议。当然,缺点是至少需要两次读数(一次是“skip”加上一次“read”),这在某些情况下可能会影响性能。 – leonbloy