我想使用 FilterInputStream 类的 skip 方法,它应该从流中跳过所需的字节数。但是跳过方法的文档说 http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterInputStream.html#skip(long)
跳过并丢弃输入流中的 n 字节数据。由于各种原因,skip 方法最终可能会跳过一些较小的字节数,可能是 0。返回实际跳过的字节数。
使用跳过方法来寻找特定位置真的安全吗?
我想使用 FilterInputStream 类的 skip 方法,它应该从流中跳过所需的字节数。但是跳过方法的文档说 http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterInputStream.html#skip(long)
跳过并丢弃输入流中的 n 字节数据。由于各种原因,skip 方法最终可能会跳过一些较小的字节数,可能是 0。返回实际跳过的字节数。
使用跳过方法来寻找特定位置真的安全吗?
FilterInputStream
只是底层的包装器InputStream
,所以它取决于底层的InputStream.skip
行为。
例如,如果底层InputStream
是FileInputStream
,那么我们应该参考FileInputStream#skip
API声明:
public long skip(long n) throws IOException
跳过并丢弃
n
输入流中的数据字节。由于各种原因,该
skip
方法最终可能会跳过一些较小的字节数,可能为 0。如果n
为负数,IOException
则抛出 an,即使在这种情况下超类的skip
方法InputStream
什么也不做。返回实际跳过的字节数。此方法可能会跳过比后备文件中剩余的字节更多的字节。这不会产生异常,并且跳过的字节数可能包括超出后备文件 EOF 的一些字节数。在跳过结尾后尝试从流中读取将导致 -1 指示文件的结尾。
从这个描述FileInputStream.skip
对我来说似乎并不可靠。
我也发现这个 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;
}
}