2014-04-04 15 views
57

Uso la libreria Square Tape per accodare i caricamenti di dati al server.EOFException durante la lettura del nastro QueueFile

La coda è archiviata in File in formato JSON. Quando l'app si avvia, inizio la coda e avvio il caricamento (ad esempio se su Wifi) Tuttavia su alcuni dispositivi sugli utenti sto vedendo EOFException con il messaggio 'null' (bloccato in crashlytics).

L'errore si verifica quando si crea un oggetto FileObjectQueue da un file esistente: dalle informazioni di debug il file effettivo è ~ 1 MB.

Qualche idea che cosa sta causando questo o come prevenirlo? - Forse ho bisogno di rispolverare il mio java.io.

Edit: usando nastro 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) 

Aggiornato - vedendo anche questo errore in quanto l'aggiornamento a 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

Quale versione della libreria stai usando? –

+0

Hey Jake, usando Tape v1.2.1 (aggiornato in questione) ma controllando il registro delle modifiche, vedo forse una correzione correlata "Prevenire la corruzione quando si espande una coda perfettamente saturata", quindi proveremo 1.2.2. grazie – scottyab

+0

Cool. Questo è esattamente il motivo per cui ho chiesto! –

risposta

1

L'EOFException mostra che fine del file è stato raggiunto, cioè non ci sono più byte da leggere. Questa eccezione è solo un altro modo per segnalare che non c'è altro da leggere, mentre altri metodi restituiscono un valore, come -1. Come puoi vedere nella traccia dello stack degli errori, i metodi che lanciano l'eccezione sono metodi letti; java.io.RandomAccessFile.readFully(RandomAccessFile.java:419) e com.squareup.tape.QueueFile.readHeader(:165). Come tale, non può essere "prevenuto" a meno che non si leggano tutti i byte (che in genere si vogliono), basta prenderlo così; catch(EOFException e) { /* ignore */ } :) https://docs.oracle.com/javase/7/docs/api/java/io/EOFException.html

+0

Generalmente sì, ma l'API di Square indica che se la coda è vuota, il metodo peek restituirà null e non genererà un'eccezione. Ci si potrebbe aspettare che la libreria gestisca internamente l'eccezione EOF. Quindi non credo che l'eccezione EOF sia normale qui. – Mikhail

Problemi correlati