2011-12-04 4 views
2

이진 파일에 일련의 다른 객체가 직렬화되었습니다. 끝까지 파일을 읽을 수있는 방법은 무엇입니까?끝까지 이진 파일을 읽으십시오.

try { 
     ObjectInputStream reader = new ObjectInputStream(new FileInputStream(fname)); 

     Object obj = reader.readObject(); 

     if (obj instanceof Azienda) { 
      Azienda a = (Azienda) obj; 
      company.put(a.getCod(), a); 
     } else if (obj instanceof Privato) { 
      Privato p = (Privato) obj; 
      privato.put(p.getCod(), p); 
     } 
    } catch (ClassNotFoundException cnfe) { 
     cnfe.printStackTrace(); 
    } catch (FileNotFoundException ffe) { 
     System.err.println("Error: the file was not found!"); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 

이렇게하면 읽기 당 한 번만 개체를 ​​읽습니다.

내가 텍스트 파일을 읽을 때 나는 당신이 예외라는 코드 냄새를 사용해야합니다 있도록 ObjectInputStream를 위해 과거를 읽을 때 예외 외에 더 EOF 체크가없는 null

답변

4
try{ 
    while(true) { 
     Object obj=reader.readObject() 
    // do sth with object 
    } 
}catch(EOFException e){ 
//we expect it so ignore 
} 

사용 제어 흐름에 대해

+0

하지만이 방법으로 파일을 읽을 때까지 무엇을해야합니까? – Mazzy

+0

EOFException이 던져 질 때까지 파일의 끝을 알립니다. –

1
ObjectInputStream reader = null; 

    try { 
     reader = new ObjectInputStream(new FileInputStream("sth")); 

     Object obj = null; 
     while ((obj = reader.readObject()) != null) { 
      System.out.println(obj); 
     } 


    } catch (EOFException e) { 
     System.out.println("finnished reading"); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } catch (FileNotFoundException ex) { 
     System.err.println("Error: the file was not found!"); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     reader.close(); 
    } 
+0

하나가 더 나은 솔루션을 볼 수 없습니다입니다! – GETah

+0

당신은 나에게 확신했다! !!! 감사합니다 순전히 !!! – Mazzy

+2

-1. 이 대답을 생각하고 그것을 테스트 할 수 있지만 스트림 끝에 null 반환하지 않습니다 : 그것은 EOFException throw합니다. –

1

스트림에서 읽을 개체가 더 이상 없을 때 EOFException이 throw 된 것으로 보입니다. 불행히도 문서화되지 않았습니다. 사전에 스트림의 개체 수를 알 수 있도록 당신이 그것을 만들

  • 이 예외를 얻을 때까지 루프에서 읽기,
  • ,
  • 는 당신이 만드는 : 그래서, 나는 다음과 같은 솔루션을 참조 스트림의 마지막 객체를 표시하는 마커 객체가 있도록
  • 모든 객체가 포함 된 List<Object>의 고유 객체를 직렬화 (및 직렬화 해제)합니다. 이 마지막 솔루션은 물론 스트림에 객체를 쓰지 못하도록하고 직렬화하기 전에 메모리에있는 모든 객체를 갖도록합니다.
1

ObjectInputStream에는 파일 끝 확인을위한 구체적인 방법이 없습니다.

그러나 모든 read...() 방법은 ObjectInputStream 일 때 파일 끝을 지나서 읽으려고 할 때 EOFException을 던집니다. 불행하게도이 명시 적으로 readObject() 문서화되지 않지만 다른 모든 방법 (readInt() 등)

http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html

+0

EOFException이 다른 readXxx 메소드에 대해 문서화되었음을 알리는 +1. ObjectInputStream의 가장 많이 사용되는 메소드 인 readObject는 그렇지 않습니다. –

관련 문제