Java “我如何检测?”;“文件结束”;在克鲁约?
我正在从Kryo中的gzip文件中读取未知数量的对象:Java “我如何检测?”;“文件结束”;在克鲁约?,java,kryo,Java,Kryo,我正在从Kryo中的gzip文件中读取未知数量的对象: Input input = new Input(new GZIPInputStream(Files.newInputStream(inputFile))); 问题是:当我从文件中读取最后一个对象时,如何检测?当我写这些对象时,我事先不知道要写多少,所以我不能在文件的开头包含对象的计数 我可以在文件末尾写入某种“虚拟”对象,以表明它是最后一个对象,但这看起来很难看。在读取每个对象后使用Input#eof()检查是否到达流的末尾。出于某种原因
Input input = new Input(new GZIPInputStream(Files.newInputStream(inputFile)));
问题是:当我从文件中读取最后一个对象时,如何检测?当我写这些对象时,我事先不知道要写多少,所以我不能在文件的开头包含对象的计数
我可以在文件末尾写入某种“虚拟”对象,以表明它是最后一个对象,但这看起来很难看。在读取每个对象后使用Input#eof()检查是否到达流的末尾。出于某种原因,Input.eof()无法有效检测eof,例如,此代码导致com.esotericsoftware.kryo.KryoException:Buffer underflow
while (!input.eof())
{
SomeClass someObject = kryo.readObject(input, SomeClass.class);
// ...
}
作为解决办法,我做了如下工作:
while (true)
{
try
{
SomeClass someObject = kryo.readObject(input, SomeClass.class);
// ...
}
catch(KryoException ke)
{
break;
}
}
编辑:我使用的是jar版本2.21,但eof使用的是2.22.cloudera.1。对于最新(3.0.3)的kryo库,您可以使用input.eof()。对于较老的版本,使用input.available()会带来性能损失(几乎慢8倍)
在Javadoc中它说了什么?从那以后你看到过这个
缓冲区下溢吗?我使用的是2.22版本,但似乎例外仍然存在。它不时出现。代码不是从多个线程运行的@NateS,有什么提示吗?
while(input.available() > 0){
someObject = kryo.readObject(input, SomeClass.class);
i++;
}