Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “我如何检测?”;“文件结束”;在克鲁约?_Java_Kryo - Fatal编程技术网

Java “我如何检测?”;“文件结束”;在克鲁约?

Java “我如何检测?”;“文件结束”;在克鲁约?,java,kryo,Java,Kryo,我正在从Kryo中的gzip文件中读取未知数量的对象: Input input = new Input(new GZIPInputStream(Files.newInputStream(inputFile))); 问题是:当我从文件中读取最后一个对象时,如何检测?当我写这些对象时,我事先不知道要写多少,所以我不能在文件的开头包含对象的计数 我可以在文件末尾写入某种“虚拟”对象,以表明它是最后一个对象,但这看起来很难看。在读取每个对象后使用Input#eof()检查是否到达流的末尾。出于某种原因

我正在从Kryo中的gzip文件中读取未知数量的对象:

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++;
}