2012-03-24 214 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