【问题标题】:How do I detect "End of File" in Kryo?如何在 Kryo 中检测“文件结尾”?
【发布时间】:2012-11-09 19:25:11
【问题描述】:

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

Input input = new Input(new GZIPInputStream(Files.newInputStream(inputFile)));

问题是:如何检测我何时从文件中读取了最后一个对象?当我写对象时,我事先不知道我会写多少,所以我不能在文件开头包含对象的数量。

我可以在文件末尾写一些“虚拟”对象来表明它是最后一个,但这看起来很难看。

【问题讨论】:

  • Javadoc 中的内容是什么?

标签: java kryo


【解决方案1】:

在读取每个对象后使用 Input#eof() 来检查是否到达了流的末尾。

【讨论】:

    【解决方案2】:

    由于某种原因,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 一起使用。

    【讨论】:

    • 从那以后你看到这个Buffer underflow了吗?我使用的是 2.22 版本,但似乎异常仍然存在。它不时出现。代码不是从多个线程运行的。 @NateS,有什么提示吗?
    【解决方案3】:

    对于最新的 (3.0.3) kryo 库,您可以使用 input.eof()。对于较旧的用户,使用 input.available() 会降低性能(几乎慢 8 倍)。

    while(input.available() > 0){
      someObject = kryo.readObject(input, SomeClass.class);
      i++;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 2017-02-04
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      相关资源
      最近更新 更多