2011-03-07 2 views
6

다음 코드는 EOFException을 생성합니다. 왜 그런가요?readObject를 사용한 Java 신비한 EOF 예외

public static Info readInfoDataFromFile(Context context) { 
    Info InfoData = null; 
    FileInputStream fis = null; 
    ObjectInputStream ois = null; 
    Object object = null; 

    if (context.getFileStreamPath("InfoFile.dat").exists()) { 
     try { 
      fis = context.openFileInput("InfoFile.dat"); 
      ois = new ObjectInputStream(fis); 
      Object temp; 
      try { 
       // here it throws EOF exception in while loop 
       while ((temp = ois.readObject()) != null) { 
        object = temp; 
       } 
      } catch (NullPointerException npe) { 
       npe.printStackTrace(); 
      } catch (EOFException eof) { 
       eof.printStackTrace(); 
      } catch (FileNotFoundException fnfe) { 
       fnfe.printStackTrace(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (ois != null) { 
        ois.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       if (fis != null) { 
        fis.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

스택 트레이스 :

03-07 14:29:01.996: WARN/System.err(13984): java.io.EOFException 
03-07 14:29:01.996: WARN/System.err(13984):  at java.io.DataInputStream.readByte(DataInputStream.java:131) 
03-07 14:29:01.996: WARN/System.err(13984):  at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:628) 
03-07 14:29:01.996: WARN/System.err(13984):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:907) 
03-07 14:29:01.996: WARN/System.err(13984):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2262)03-07 14:29:01.996: WARN/System.err(13984):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2217) 
03-07 14:29:01.996: WARN/System.err(13984):  at 
+2

자바 독 :'로 OptionalDataException의 원인이됩니다 대응하는 writeObject 메소드에 의해 기입해진 커스텀 데이터의 경계를 초과하는 오브젝트 데이터를 읽어들이려고이 TRUE ' – malinois

+0

의 eof 필드의 값이 발생 될 수 그래 나는 이미 그것을 읽고 그러나 그것을 피하는 방법? –

답변

9

는 파일이 포함 얼마나 많은 개체에 따라 다릅니다. 개체가 하나 뿐인 경우 한 단계로 역 직렬화 할 수 있습니다.

try { 
    Object temp = ois.readObject(); 
} 
catch(Exception e) { 
    //handle it 
} 
+2

네,하지만 오류 EOF .. 던졌습니다 왜? –

+0

친절하게 스택 추적을 참조하십시오. –

+6

@Aizaz : 왜 파일의 끝에'readObject()'가'null'을 돌려 주길 기대합니까? 항상 객체를 반환하거나 예외를 throw하도록 지정되어 있지 않습니다. 따라서 명시 적으로'null '을 직렬화하지 않았다면,'readObject()'가'null'을 반환하는 것을 기대해서는 안됩니다. –

2

ObjectInputStreamreadObject()의 정의는 스트림의 마지막에 이르렀을 때 null을 반환하도록 지정하지 않습니다. 대신 파일 끝에 추가 객체를 읽으려고하면 예외가 발생합니다. 그것을 만들 때 스트림에 null를 쓴 경우 모든

+0

그러면 파일을 끝내는 시점에서 어떻게 감지 할 수 있습니까? 나는 EOF 예외를 피하는 방법을 의미합니까? –

+0

예상되는 개체 수를 알려주거나 제대로 EOF 예외를 처리하는 정보를 파일에 저장하십시오. 예외는 반드시 '실패'는 아니지만 스택을 통해 상태 변경 사항을 전파하는 방법으로 사용될 수 있습니다. – AndyT

+0

@Aizaz : * catch * it! – EJP

4

첫째, readObject()null를 반환합니다. 스트림에 더 이상 데이터가 없으면 EOFException이 표시됩니다.

EOF를 예상하지 않으면 스트림이 손상되었을 가능성이 있습니다. 데이터를 기록한 후 닫는 것을 잊어 버린 경우에 발생할 수 있습니다.

+0

그러면 우리는 파일의 끝에서 어떻게 감지 할 수 있습니까? 나는 EOF 예외를 피하는 방법을 의미합니까? –

+4

@Aizaz : EOFException은이를 알려줍니다.점검 된 예외는 제어 흐름을 포착하고 검사해야합니다. 오류는 아니지만 추가 반환 코드입니다. 때때로. 올바르게 사용 된 경우. 대부분의 IOExceptions에는 해당되지 않습니다. 그러나 EOFException을 수정하십시오. ... 헴. 또 다른 해결책은 객체 앞에 스트림의 객체 수를 쓰는 것입니다. 따라서 알려진 횟수만큼 반복 할 수 있습니다. 또는 개체를 목록이나 배열과 같은 컨테이너에 넣고 대신 컨테이너를로드하십시오. –

+0

이것이 올바른 대답이라고 생각합니다 : @Aizaz - readObject()는 전체 파일을 한 번에 읽고 역 직렬화합니다. 그냥 한 번만 호출하고 루프가 아닌지 확인하십시오. - adarshr 18 시간 전 –

5

나는 신비한 동일한 EOFException을 가졌으며 ObjectOutputStream을 통해 ObjectInputStream에 보내는 것은 Object Class의 경로였습니다. 그들은 동일한 경로 (동일한 패키지 이름과 물론 동일한 클래스 이름)를 가져야합니다.