使用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的行为。

例如,如果基础InputStreamFileInputStream,那么我们应该参考FileInputStream#skip API,其中指出:

FileInputStream#skip

跳过并丢弃输入流中的public long skip(long n) throws IOException个字节的数据。

n方法可能由于各种原因而最终跳过一些较小的字节,可能为0。如果skip为负,则即使n方法为IOException,也会抛出skip。在这种情况下,InputStream超类不执行任何操作。返回跳过的实际字节数。

此方法可能会跳过比备份文件中剩余字节更多的字节。这不会产生异常,并且跳过的字节数可能包括超出备份文件的EOF的一定数量的字节。跳过结尾后尝试从流中读取将导致-1表示文件结束。

从此描述FileInputStream.skip在我看来似乎不可靠。

以上是关于使用FilterInputStream的跳过方法的主要内容,如果未能解决你的问题,请参考以下文章

unittest单元测试框架之测试用例的跳过(skip)

Spring Batch 中的跳过是如何实现的?

I/O:FilterInputStream

添加新的跳过索引

如何使用想要的跳过检查缺少的数字序列

Discord 音乐机器人上的跳过功能会删除所有数组条目