使用FilterInputStream的skip方法

时间:2013-02-18 10:37:41

标签: java inputstream skip

我想使用FilterInputStream类的skip方法,它应该从流中跳过所需的字节数。 但是skip方法的文档说 http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterInputStream.html#skip(long)

  

跳过并丢弃输入流中的n个字节的数据。 由于各种原因,跳过方法最终会跳过一些   较小的字节数,可能为0 。实际的字节数   跳过了。

为了寻找特定的位置,使用skip方法是否真的安全?

2 个答案:

答案 0 :(得分:0)

FilterInputStream只是底层InputStream的包装器,因此它依赖于底层的InputStream.skip行为,例如:如果是FileInputSttream,我们应该引用文件说明

的FileInputSttream.skip API

由于各种原因,跳过方法可能最终跳过一些较小的字节数,可能为0.如果n为负数,则抛出IOException,即使InputStream超类的skip方法确实存在在这种情况下没有。返回跳过的实际字节数。 此方法可能会跳过比备份文件中剩余的更多的字节。这不会产生异常,跳过的字节数可能包括超出后备文件EOF的一些字节数。跳过结束后尝试从流中读取将导致-1表示文件结束。

从这个描述中,FileInputStream.skip对我来说似乎不可靠。

答案 1 :(得分: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;
    }
}