我不认为我们可以得到一个真正健壮的实现,因为skip()
方法契约相当奇怪。一方面,at 的行为EOF
没有很好的定义。如果我想跳过 8 个字节并is.skip(8)
返回0
,那么决定是否应该再试一次并不是一件容易的事,如果某些实现选择返回,则存在无限循环的0
危险EOF
。而且available()
也不值得信任。
因此,我提出以下建议:
/**
* Skips n bytes. Best effort.
*/
public static void myskip(InputStream is, long n) throws IOException {
while(n > 0) {
long n1 = is.skip(n);
if( n1 > 0 ) {
n -= n1;
} else if( n1 == 0 ) { // should we retry? lets read one byte
if( is.read() == -1) // EOF
break;
else
n--;
} else // negative? this should never happen but...
throw new IOException("skip() returned a negative value. This should never happen");
}
}
我们不应该返回一个值来告知“真正跳过”的字节数吗?还是一个布尔值来通知 EOF 已达到?我们不能以稳健的方式做到这一点。例如,如果我们调用skip(8)
一个FileInputStream
对象,即使我们在 at ,或者文件只有 2 个字节,它也会返回 8 。EOF
但是从某种意义上说,该方法是健壮的,因为它可以执行我们想要的操作:跳过n
字节(如果可能)并让我继续处理它(如果我的下一次读取返回-1
,我会知道EOF
已经达到)。