使用FilterInputStream的跳过方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用FilterInputStream的跳过方法相关的知识,希望对你有一定的参考价值。
我想使用FilterInputStream类的skip方法,该方法应该跳过流中所需的字节数。但是skip方法的文档说http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterInputStream.html#skip(long)
跳过并丢弃输入流中的n字节数据。 跳过方法可能由于各种原因而最终跳过了一些较小的字节数,可能为0。实际字节数返回跳过的内容。
为了寻求特定位置而使用然后跳过方法真的安全吗?
我也发现此API有点问题。它给特定的实现留下了太多的自由:
1)不清楚在流结束时会发生什么
2)不清楚流是否为非空时,重复调用skip将最终返回正数。
假设您知道n不在流的末尾,并假设(2)成立,那么以下代码可能会有所帮助:
public static void skipSecure(InputStream is, long n) throws IOException
while (n >= 0)
long skipped = is.skip(n);
n -= skipped;
[FilterInputStream
只是基础InputStream
的包装,因此它取决于基础InputStream.skip
的行为。
例如,如果基础InputStream
是FileInputStream
,那么我们应该参考FileInputStream#skip
API,其中指出:
FileInputStream#skip
跳过并丢弃输入流中的
public long skip(long n) throws IOException
个字节的数据。
n
方法可能由于各种原因而最终跳过一些较小的字节,可能为0。如果skip
为负,则即使n
方法为IOException
,也会抛出skip
。在这种情况下,InputStream
超类不执行任何操作。返回跳过的实际字节数。此方法可能会跳过比备份文件中剩余字节更多的字节。这不会产生异常,并且跳过的字节数可能包括超出备份文件的EOF的一定数量的字节。跳过结尾后尝试从流中读取将导致-1表示文件结束。
从此描述FileInputStream.skip
在我看来似乎不可靠。
以上是关于使用FilterInputStream的跳过方法的主要内容,如果未能解决你的问题,请参考以下文章