2016-06-10 59 views
0

我知道通常應該在finally中關閉Java中的streamsformatters(特別是java.util.Formatter)以避免資源泄漏。但是在這裏我有點困惑,因爲我看到很多例子,人們在沒有任何最終塊的情況下關閉它,尤其是格式化程序。這個問題可能對某些人沒有意義,但我想確定我在問什麼。 java2s.comtutorialspoint.com的一些示例,其中格式化程序只是在沒有任何塊的情況下關閉。
請認爲我的問題只適用於Java 6及更低版本,因爲我知道如何使用資源。如何最終關閉Java格式化程序?

例子:

public static void main(String[] args) { 


    StringBuffer buffer = new StringBuffer(); 
    Formatter formatter = new Formatter(buffer, Locale.US); 

    // format a new string 
    String name = "from java2s.com"; 
    formatter.format("Hello %s !", name); 

    // print the formatted string 
    System.out.println(formatter); 

    // close the formatter 
    formatter.close(); 

    // attempt to access the formatter results in exception 
    System.out.println(formatter); 
} 
+0

如果您提供一個示例而不是鏈接到大型代碼庫網站,會更好。你關心哪種格式化器?有很多格式化程序類可以用於各種目的,所以如果縮小範圍會有所幫助。 – micker

+0

@感謝您的通知,我已經更新了更多的細節問題。 – karate

回答

1

在這個具體的例子,它是沒有必要調用close()。只有需要關閉格式化程序,如果相關的appender是Closable。在這種情況下,您使用的是StringBuffer,它不是Closable,因此致電close()時什麼也不做。如果您要使用WriterPrintStream,那些可以關閉,並且需要撥打close()以避免將流打開。

如果您不確定是否爲Closable,最好只需撥打close()。這樣做沒有危害。

+0

現在很清楚,謝謝!這是我正在尋找的答案。 – karate

0

這個怎麼樣,沒有進一步的評論:

public static void main(String[] args) { 
    StringBuffer buffer = new StringBuffer(); 
    Formatter formatter = null; 
    try { 
    formatter = new Formatter(buffer, Locale.US); 
    String name = "from java2s.com"; 
    formatter.format("Hello %s !", name); 
    System.out.println(formatter); 
    } 
    finally { 
    if (formatter != null) { 
     formatter.close(); 
    } 
    } 
} 
+0

我的問題是,是否有任何特定的理由不能最終關閉它,因爲我想也許有一些我想知道的細微差別。 – karate

+0

我寧願使用close()正確加班,以獲得一致的編碼風格,這也可以避免未來版本的Java出現錯誤,對於未來需要關閉的情況,或者您將與之合作的情況一個派生類,需要關閉它的資源。另外我會推薦閱讀Scott Meyers和Herb Sutter - 這不是關於Java,而是關於一般編碼實踐。 – digipenKH

+0

是的,我同意你的看法,但我的目的只是爲了瞭解其中的差異。 – karate

相關問題