2012-10-17 63 views
4

System.out是一個PrintStream對象。我閱讀了PrintStream上的文檔。我沒有得到的是爲什麼System.out.print導致緩衝區被刷新?這不應該只發生在println上嗎?爲什麼System.out.print會導致自動刷新?

+2

相關 - http://stackoverflow.com/questions/9402529/will-javas-system-out-print-buffer-forever-until-println – Coffee

回答

1

這不應該只發生在println上嗎?

Javadoc沒有說什麼時候它不會被刷新。它說刷新在println()或換行

+0

我一直在NetBeans中試驗這個。顯然這似乎並不重要。即使在關閉自動刷新功能時,println似乎也在沖洗。這裏是我的小代碼: public class C {public static void main(String [] args)throws IOException {0} {0} {0} {0} PrintStream ps = new PrintStream(new FileOutputStream(「Test.txt」)); ps.println(「VinDiesel!」); //ps.flush(); ps.close(); } } – Chatterjee

+0

@Chatterjee我沒有看到該測試應該證明什麼。它不使用系統,並關閉流刷新它。 – EJP

+0

是的,我剛纔意識到。我寧願將其重寫爲println不適用於普通的PrintStream對象。但是,假設我在關閉之前嘗試從同一個文件讀取數據。我仍然發現字符串已被刷新。我在這裏認真做錯了什麼?對不便,我很抱歉 – Chatterjee

0

您希望在調用System.out.print()時刷新緩衝區,因爲您希望打印該緩衝區。當我打印時,我想讓它打印一些東西。如果沒有刷新,它只會留在緩衝區中,我什麼都看不到。

檢出沖水here

基本上它是一個保證,它會立即打印。

+0

我明白這一點。不過,我引用了PrintStream的Java文檔中的以下內容: 「或者,可以創建PrintStream以便自動刷新;這意味着在寫入字節數組後,會自動調用flush方法,其中一個println方法被調用,或者換行字符或字節('\ n')被寫入。「 這裏沒有說明打印的調用會導致緩衝區被刷新。多數民衆贊成我的意思 – Chatterjee

1

在重複事實已經被注意到的危險,讓我嘗試解釋文檔的方式有點不同......

看來,這只是在PrintBuffer 創建時(即,在構造函數調用期間)可以設置PrintStream的autoFlush行爲。另外,正如您已經指出的那樣,該文檔指出,在調用任何各種公共PrintBuffer構造函數時,如果未指定autoflush狀態,將導致創建非自動填充PrintStream。

但是,在System.out的情況下,沒有調用PrintBuffer的construtor。 java.lang.System類在VM啓動時實例化「out」PrintStream。這意味着,當您請求System對象存儲在其「out」字段中的PrintStream對象時,您不知道調用了哪個構造函數,因此當您詢問時不知道流傳遞給您的自動刷新狀態爲了它。

我同意,如果用於java.lang.System的doc指定包含在其「out」字段中的流將其自動刷新行爲設置爲true,那將會非常好。但是,這不是一個「要求」,不僅僅是我需要記錄從我的(假設的)myCrazyPanel.getTheChangeColorsButton()返回的JButton是啓用還是禁用。是的,按鈕默認啓用,但如果JButton被禁用,則不允許抱怨。這裏同樣的事情。

+0

感謝您的解釋@Bob。我現在試圖檢查println是否在普通的PrintStream對象的情況下自動刷新 – Chatterjee

相關問題