使用FilterInputStream的跳过方法

问题描述 投票:0回答:2

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

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

为了寻求特定位置而使用然后跳过方法真的安全吗?

java inputstream skip
2个回答
1
投票

我也发现此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;
    }
}

0
投票

[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在我看来似乎不可靠。

© www.soinside.com 2019 - 2024. All rights reserved.