【问题标题】:EOFException when reading QueueFile tape读取 QueueFile 磁带时出现 EOFException
【发布时间】:2014-05-16 17:10:56
【问题描述】:

我正在使用 Square 的 Tape 库来排队上传数据到服务器。

队列以 JSON 格式存储在 File 中。当应用程序启动时,我初始化队列并开始上传(即如果在 Wifi 上)但是在用户的某些设备上,我看到 EOFException'null' 消息(登录 crashlytics)。

从现有文件创建 FileObjectQueue 对象时会发生错误 - 从调试信息收集的实际文件约为 1MB。

任何想法是什么导致了这种情况或如何防止它? - 也许我需要清理一下我的 java.io。

编辑:使用 Tape v1.2.1

Caused by: java.io.EOFException
at java.io.RandomAccessFile.readFully(RandomAccessFile.java:419)
at java.io.RandomAccessFile.readInt(RandomAccessFile.java:439)
at com.squareup.tape.QueueFile.readElement(:182)
at com.squareup.tape.QueueFile.readHeader(:162)
at com.squareup.tape.QueueFile.(:110)
at com.squareup.tape.FileObjectQueue.(:35)
at com.myapp.queue.MyUploadTaskQueue.create(:125)

更新 - 升级到 1.2.2 后也出现此错误

Caused by: java.io.IOException: File is corrupt; length stored in header is 0.
       at com.squareup.tape.QueueFile.readHeader(:165)
       at com.squareup.tape.QueueFile.<init>(:117)
       at com.squareup.tape.FileObjectQueue.<init>(:35)

【问题讨论】:

  • 你使用的是什么版本的库?
  • 嘿,Jake,使用 Tape v1.2.1(已更新),但只是检查了更改日志,我看到可能有一个相关的修复“在扩展完全饱和的队列时防止损坏”,所以要尝试 1.2.2。谢谢
  • 酷。这正是我问的原因!
  • 嘿@JakeWharton 1.2.2 似乎没有修复,仍然得到很多 EOFExceptions。我正在使用磁带示例代码中所述的 GSON 转换器。你认为不同的序列化格式有帮助吗?
  • 我最终通过将 Dagger 提供的 ObjectQueue 实例设置为 Singleton 来解决这个问题。这可能是我的错误,也是正确的做法。

标签: java android exception square-tape


【解决方案1】:

EOFException 表明已到达文件结束,即没有更多字节可读取。这个异常只是另一种表示没有更多可读取的信号的方式,而其他方法返回一个值,例如 -1。正如您在错误堆栈跟踪中看到的,抛出异常的方法是读取方法; java.io.RandomAccessFile.readFully(RandomAccessFile.java:419)com.squareup.tape.QueueFile.readHeader(:165)。因此,除非您没有读取所有字节(您通常想要),否则它不能被“阻止”,就像这样捕获它; catch(EOFException e) { /* ignore */ } :) https://docs.oracle.com/javase/7/docs/api/java/io/EOFException.html

【讨论】:

  • 通常是的,但是 Square 的 API 声明如果队列为空,peek 方法将返回 null 并且不会抛出异常。我们可能期望该库将在内部处理 EOF 异常。所以我不相信EOF异常在这里是正常的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2012-09-22
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多