我想使用FilterInputStream类的skip方法,它应该从流中跳过所需的字节数。 但是skip方法的文档说 http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterInputStream.html#skip(long)
跳过并丢弃输入流中的n个字节的数据。 由于各种原因,跳过方法最终会跳过一些 较小的字节数,可能为0 。实际的字节数 跳过了。
为了寻找特定的位置,使用skip方法是否真的安全?
答案 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;
}
}