2012-03-31 55 views
1

考慮這個碼流:關閉只有當它打開

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"); 
    } 

在第二個catch塊,我關閉流,但我不知道它是否應該被關閉。
如果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

而且我在哪裏關閉流? – 2012-04-02 10:48:06

+0

@Ramy AI Zuhouri當模塊退出時,try-with-resources語句爲您關閉流。閱讀我給你的鏈接。 – Jeffrey 2012-04-02 14:03:26

1

你可以添加,如果關閉流作爲前條件如下

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

添加finally塊的try-catch語句並做閉幕那裏。爲了避免其他的try-catch,並在那裏你可以使用commons.io IOUtils.closeQuietly()一個nullcheck:

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); 
    }  
相關問題