2012-03-31 1 views
1

이 코드를 고려 열 유일의 경우 스트림 닫기 : 두 번째 catch 블록에서

FileOutputStream stream=null; 
    ObjectOutputStream objStr=null; 
    try 
    { 
     stream=new FileOutputStream(defaultFile); 
     objStr=new ObjectOutputStream(stream); 
     objStr.writeObject(obj); 
     objStr.close(); 
    } 
    catch(FileNotFoundException e) 
    { 
     System.out.println("Il file "+ defaultFile+ " non è stato trovato\n"); 
    } 
    catch(IOException e) 
    { 
     stream.close(); 
     System.out.println("Si è verificato un problema di I/O nell' apertura dello stream"); 
    } 

를, 내가 스트림을 닫습니다하지만이 닫혀해야하는지 확실하지 않다.
ObjectOutputStream의 생성자가 실패하면 두 번째 catch에 들어가지만이 경우 FileOutputStream이 열린 상태로 유지됩니까?
모든 예외를 처리하기 위해 finally 블록을 작성해야합니까?
모든 사례를 파악하기가 어렵습니다.

답변

4

Java 7을 사용하는 경우 try-with-resources 문을 사용하여 모든 닫기를 처리 할 수 ​​있습니다.

try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(defaultFile))) { 
    oos.writeObject(obj); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

그리고 스트림을 어디에 닫아야합니까? –

+0

@Ramy AI Zuhouri try-with-resources 문은 블록이 종료 될 때 스트림을 닫습니다. 내가 준 링크를 읽으십시오. – Jeffrey

1

추가로 스트림을 닫기 전에 조건이

if(stream != null) { 
    stream.close(); 
} 
2

을 따르는 경우 최종적으로 시도-catch 문에 차단 추가하고 거기에 마감 할 수 있었다. 다른 try-catch 및 nullcheck을 피하려면 commons.io를 사용할 수 있습니다. IOUtils.closeQuietly() :

FileOutputStream stream = null; 
    ObjectOutputStream objStr = null; 
    try { 
     stream = new FileOutputStream(defaultFile); 
     objStr = new ObjectOutputStream(stream); 
     objStr.writeObject(obj); 
    } catch (FileNotFoundException e) { 
     System.out.println("Il file " + defaultFile + " non è stato trovato\n"); 
    } catch (IOException e) { 
     System.out.println("Si è verificato un problema di I/O nell' apertura dello stream"); 
    } finally { 
     IOUtils.closeQuietly(stream); 
     IOUtils.closeQuietly(objStr); 
    }