2012-03-24 95 views
4

我想在Java中製作跨平臺控制檯進度指示器。因此我使用System.out.printf方法打印出一個百分比:Java printf不打印

System.out.printf("\t%2.2f%%\b\b\b\b\b\b", percentage); 

我把它放在for循環中。我遇到的問題是,在整個for循環完成之前它不會打印任何內容。這是一個程序示例來顯示問題:

public class Test { 

    public static void main(String[] args) { 
     for(int i =0; i<5000; i++){ 
      System.out.printf("\b\b\b\b\b\b%2.2f%%", ((float) i/5000f)*100f); 
      System.out.flush(); 
     } 
    } 
} 

我認爲這個問題與編譯器優化有關,但我不舒服。奇怪的是,當for循環運行時,System.out.println會打印出來。

編輯:我忘了把它添加到問題。但我已經嘗試沖洗緩衝區。這沒有什麼區別。將%n添加到我的printf行的結尾,但它啓動了一個換行符,我真的需要它重新使用當前行。

所有反對的解決方案的工作。但他們只能在真正的遊戲機上工作。不是netbeans或eclipse控制檯。

+0

你的代碼的工作,對我來說是有點快,所以我包括一個'嘗試{ \t了Thread.sleep(10); } catch(InterruptedException ignored){}'。 – 2012-03-24 16:52:14

回答

5

這是因爲輸出流是行緩衝的。如果在格式字符串的末尾添加「%n」,則還會生成換行符,並且該行將被刷新(即打印)。或者撥打System.out.flush()手動刷新輸出流並強制緩衝內容打印。

+0

感謝您的沖洗提示! – 2014-04-11 18:53:28

1

通話添加到flush()

for(int i =0; i<5000; i++){ 
     System.out.printf("\b\b\b\b\b\b%2.2f%%", ((float) i/5000f)*100f); 
     System.out.flush(); 
    } 

沒有flush(),輸出中只得到在一段時間刷新一次緩衝區被累積(當它的全部,或每當打印換行)。

奇怪的是System.out.println在for循環運行時會打印。

原因是該流是行緩衝的。這意味着每個換行觸發一個隱式刷新。你的代碼和println()之間的區別在於後者在每次調用時會打印一個換行符。

2

再次問題是沖洗流。加入這一行你printf後:

System.out.flush(); 

System.out.println被刷新(很像C++的<< endl)。但是,printf不是刷新並正在使用緩衝區。

+0

沖洗是方法,所以你肯定需要括號。 – 2012-03-24 15:16:09

+0

我在原始代碼中添加了括號,我發現它們沒有被複制。我將它固定在起始帖子中。問題仍未解決。 – 2012-03-24 15:17:38

+0

以及用新的替換舊字符的目標是什麼,所以你得到類似於櫃檯的東西? – 2012-03-24 15:19:35

0

嘗試使用Console代替:

for(int i =0; i<5000; i++){ 
    System.console().format("\b\b\b\b\b\b%2.2f%%", ((float) i/5000f)*100f); 
    System.console().flush(); 
} 
+0

什麼平臺?他的代碼適用於我:Java-1.6,Linux32。 – 2012-03-24 16:53:35