1

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

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

使用跳过方法来寻找特定位置真的安全吗?

4

2 回答 2

1

FilterInputStream只是底层的包装器InputStream,所以它取决于底层的InputStream.skip行为。

例如,如果底层InputStreamFileInputStream,那么我们应该参考FileInputStream#skipAPI声明:

public long skip(long n) throws IOException

跳过并丢弃n输入流中的数据字节。

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

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

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

于 2013-02-18T11:04:25.780 回答
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;
    }
}
于 2013-02-18T11:19:59.957 回答