2017-11-20 10 views
0

저는 처음으로 FileInputStream으로 작업 중이며 파일에서 객체 (Item)를로드하려고합니다. ObjectInputStream을 올바르게 닫는 방법?

내 코드입니다 :이 그것을 할 수있는 표준 방법입니다 읽었습니다

try { 

     FileInputStream fi = new FileInputStream(f); 
     ObjectInputStream reader = new ObjectInputStream(fi); 

     while (true) { 
      Item i = (Item)reader.readObject(); 
      System.out.println(i.getName()); 
     } 

    } catch (Exception e) { 
     System.out.println(e.toString()); 
    } 

와 코드가 잘 작동합니다. 그러나 EOFException이 던져 지자 마자 컴파일러가 catch 블록으로 점프하기 때문에 fireader은 절대로 닫히지 않습니다.

컴파일러는 나를 fireadercatch에서 또는 finally 블록을 종료하지 않습니다. 이게 진짜로 있어야하는 방법인가요? 입력 개체를 제대로 닫으려면 어떻게해야합니까?

+1

try/catch 외부 변수를 선언하고 내부에 할당하십시오. 그런 다음 finally 블록 안에서 닫을 수 있습니다. – csmckelvey

+3

try-with-resources를 사용하십시오. https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html – Pshemo

답변

5

의 당신이 시도 --자원과 문 사용할 수 있습니다 그것은 다음과 같이 표시됩니다 여기에

try (FileInputStream fi = new FileInputStream(f); 
    ObjectInputStream reader = new ObjectInputStream(fi)) {   

    while (true) { 
     Item i = (Item)reader.readObject(); 
     System.out.println(i.getName()); 
    } 

} catch (Exception e) { 
    System.out.println(e.toString()); 
} 

이 방법에 대한 자세한 내용은 documentation입니다. 범위 지정 작동 방법에

1

사용 try with resources statement :

try(FileInputStream fi = new FileInputStream(f)){ 
    try(ObjectInputStream oi = new ObjectInputStream(fi)){ 
     // your code 
    } 
} 

당신에는 InputStream가 어떤 경우에 닫혀 그런 식으로. 에 관계없이 예외

1

덕분에, 당신은 당신이 시도하고있는 새 try/finally를 연결할 경우, 다음과 같이 그것을 할 각 Stream :

try { 

    FileInputStream fi = new FileInputStream(f); 
    try { 
     ObjectInputStream reader = new ObjectInputStream(fi); 
     try { 
      while (true) { 
       Item i = (Item)reader.readObject(); 
       System.out.println(i.getName()); 
      } 
     } finally { 
      reader.close(); 
     } 

    } finally { 
     fi.close(); 
    } 

} catch (Exception e) { 
    System.out.println(e.toString()); 
} 

하지만 자바의 최신 버전에서

(TRY-와와 -resources) 실제로 이렇게 할 수 있습니다 :

try (FileInputStream fi = new FileInputStream(f), 
    ObjectInputStream reader = new ObjectInputStream(fi)) { 

    while (true) { 
     Item i = (Item)reader.readObject(); 
     System.out.println(i.getName()); 
    } 

} catch (Exception e) { 
    System.out.println(e.toString()); 
} 

그리고 컴파일은 본질적으로 첫 번째 버전으로 변환합니다.