Dre*_*kes 10 java inputstream skip stream java-io
我正在处理二进制流,需要有效地跳过我不感兴趣的一系列数据,以及一些将被处理的数据.
InputStream.skip(long) 在保证方面做得不多:
跳过并丢弃此输入流中的n个字节的数据.由于各种原因,跳过方法可能最终跳过一些较小数量的字节,可能为0.这可能是由许多条件中的任何一个引起的; 在跳过n个字节之前到达文件末尾只有一种可能性.返回跳过的实际字节数.
我需要知道发生了两件事之一:
很简单.但是,在此描述中提供的宽大意味着,例如,BufferedInputStream可以跳过几个字节并返回.当然,它告诉我它只是跳过了那几个,但不清楚为什么.
所以我的问题是:你是否能够InputStream.skip(long)以这样的方式使用你知道什么时候流结束或跳过成功?
leo*_*loy 10
我认为我们不能得到一个非常强大的实现,因为skip()方法契约相当奇怪.首先,EOF的行为没有明确定义.如果我想跳过8个字节并EOF返回0,那么判断我是否应该再次尝试并不容易,如果某些实现选择在EOF时返回0,则存在无限循环的危险.is.skip(8)也不值得信任.
因此,我提出以下建议:
/**
* 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");
}
}
Run Code Online (Sandbox Code Playgroud)
我们不应该返回一个值来通知"真正跳过"的字节数吗?或者是一个布尔值来告知已达到EOF?我们不能以强有力的方式做到这一点.例如,如果我们调用0了的FileInputStream对象,它将返回8即使我们在EOF,或者如果该文件只有2个字节.但是该方法在我们想要的意义上是健壮的:跳过0字节(如果可能的话)并让我继续处理它(如果我的下一次读取返回-1,我将知道已达到EOF).
| 归档时间: |
|
| 查看次数: |
4645 次 |
| 最近记录: |