2015-10-31 45 views
0

雖然學習Java,我發現(急忙在我的代碼中使用)下面的代碼模式從JDK格式化程序如何與BufferedWriter協作而不關閉?

public Formatter(OutputStream os, String csn, Locale l) 
    throws UnsupportedEncodingException 
{ 
    this(l, new BufferedWriter(new OutputStreamWriter(os, csn))); 
} 

它通過一個新創建的BufferedWriterother constructor指它作爲一個Appendable接口(使之不能進一步刷新或關閉在Formatter實現):

private Formatter(Locale l, Appendable a) { 
    this.a = a; 
    this.l = l; 
    this.zero = getZero(l); 
} 

經過一番思考和挖掘出BufferedWriter代碼,我不明白如何能正常工作 - 從BufferedWriter代碼它看起來像它會失去緩衝的數據,如果沒有完成時關閉。 Finalize方法似乎不被使用。 Formatter類中有許多其他構造函數,它們以類似的方式使用BufferedWriter(主要是封裝輸出流和文件)。那麼緩衝區沖洗如何在這個代碼中工作?或者這是JDK中的一堆bug(這對我來說聽起來令人難以置信,因爲它是非常基本的和舊的功能)?

回答

0

格式化程序是可以關閉的。就像輸出流,它因而應該由格式化的用戶關閉,並在關閉該關閉背襯的BufferedWriter(和包裹的OutputStream,傳遞地):

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Formatter.java#Formatter.close%28%29

這是因此客戶機代碼的責任如果它是使用OutputStream構造的,則關閉Formatter。

+0

謝謝,現在我明白了。我的印象是,如果我們僅通過Appendable接口存儲引用,那麼我們無法在其上調用close()。完全忘了關於instanceof魔法和類型鑄造的可能性。 – vagran

相關問題