2012-12-07 30 views
-2

我目前在java中做這樣的事情來釋放資源。我是否需要在BufferedWriter對象上調用close或在析構函數中調用它?關於Resource1和Resource2,我必須致電發佈和免費。這是嵌套式的正確方法嗎? Python有一個非常好的「聲明」,它將資源與代碼範圍相關聯。 java有喜歡嗎?在Java中關閉資源

Resource1 r1 = new Resource1(); 
try 
{ 
    ... 
    Resource2 r1 = new Resource2(); 
    try 
    { 
     ... 
     java.io.BufferedWriter f = new java.io.BufferedWriter(new java.io.FileWriter(new java.io.File("f"))); 
     try 
     { 
      ... 
     } 
     finally 
     { 
      f.close(); 
     } 
    } 
    finally 
    { 
     r2.release(); 
    } 
} 
finally 
{ 
    r1.free(); 
} 

UPDATE: 我使用Java 1.6

+1

Java 7已經嘗試使用資源特性,從您的問題中不清楚您使用的是哪個java版本http://docs.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources。 html – kosa

+0

[How to Correctly Close Resources](http://stackoverflow.com/questions/5782647/how-to-correctly-close-resources) – djechlin

+0

請先Google。 – djechlin

回答

3

你有什麼關於BufferedWriter是正確的。

但是,您可能想要吞下close期間發生的任何異常。這是煩人的,但必要的。通常情況下,以下模式時:

BufferedWriter f = null; 
try { 
    f = new BufferedWriter(...); 
    ... 
} 
finally { 
    try { 
    if(f != null) { 
     f.close(); 
    } 
    } 
    catch(IOException e) { 
    // Nothing can be done, except maybe log it. 
    } 
} 

IOUtils.finallyClose()可以用來刪除關於關閉捕捉的需要。

Java doesn't quite have析構函數的概念,但確實有finalize(),當對象被垃圾收集時它會調用。您應該從不依靠finialize()來關閉或以其他方式清理對象。

Btw,Java 7 introduced關閉實現Closeable的對象的更短的語法。

try (BufferedWriter f = new BufferedWriter(new FileWriter(new File("f"))) { 
    ... 
} 

編輯︰我擴大finally..close。

+0

我是新來的Java但我從來沒有吞下例外。我必須真的這樣做嗎?不保證是行後面的實例java.io.BufferedWriter f = ...? – Baz

+1

是的(除非你使用新的Java 7語法)。一些人批評孫進行了近距離投球檢查。我想知道在收盤時出現問題是件好事,但在很多情況下,在那段時間內你無能爲力。在幾乎所有其他情況下,吞下異常是一個糟糕的主意。 我強烈建議使用Java 7這種東西,如果這是你的選擇。 – mikeslattery

2

您需要關閉文件句柄和其他類似resoures自己。依靠終結器來做到這一點是一種糟糕的做法。

+0

finally塊意味着關閉你的資源,我不明白你的答案 – PermGenError

+0

是的。雖然你問這是否正確。這是對的。 – h22

+0

我不是OP,:P,我不明白你的代碼中的'finalizer'是什麼意思? – PermGenError