2014-04-04 1 views
57

Square의 Tape 라이브러리를 사용하여 데이터 업로드를 서버에 대기 중입니다.QueueFile 테이프를 읽을 때 EOFException이 발생했습니다.

대기열은 JSON 형식의 파일에 저장됩니다. 앱이 시작될 때 대기열을 초기화하고 업로드를 시작합니다 (예 : Wi-Fi의 경우).하지만 사용자의 일부 기기에서 과 메시지가 표시됩니다 (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과 같은 값을 리턴하는 반면 더 읽을 것이 없다는 신호를 보내는 또 다른 방법 일뿐입니다. 오류 스택 추적에서 볼 수 있듯이 예외를 throw하는 메서드는 읽기 메서드입니다. 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을 반환하고 예외를 throw하지 않습니다. 라이브러리가 내부적으로 EOF 예외를 처리 할 것으로 예상 할 수 있습니다. 그래서 나는 여기 EOF 예외가 정상이라고 믿지 않는다. – Mikhail

관련 문제