2014-04-04 42 views
57

我正在使用Square的Tape库将数据上传到服务器。阅读QueueFile磁带时出现EOFException

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

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

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

编辑:使用磁带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) 
+0

您使用的是什么版本的库? –

+0

嘿杰克,使用磁带v1.2.1(更新问题),但只是检查更改日志,我看到可能是一个相关的修复“防止腐败时,扩大一个完全饱和的队列”,所以要试试1.2.2。 thx – scottyab

+0

很酷。这正是我问的原因! –

回答

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

+0

通常是的,但Square的API指出,如果队列为空,peek方法将返回null并且不会引发异常。我们可能期望该库将在内部处理EOF异常。所以我不认为EOF异常在这里是正常的。 – Mikhail

相关问题