2012-02-15 104 views
3

我有一个控制台应用程序,我想在命令行上放置一个非确定性进度条,同时执行一些繁重的计算。目前我只是打印出'。'在while循环每次迭代类似以下内容:在java命令行上的非确定性进度条

while (continueWork){ 
    doLotsOfWork(); 
    System.out.print('.'); 
} 

其作品,但我想知道如果任何人有一个更好/更聪明的想法,因为这能得到一点点讨厌,如果有通过多次迭代循环。

+1

总是有经典指数进度条。第一次迭代时中途填满,第二次中途填满一半(75%),依此类推。无论是那种还是'沙漏'的方法,你只需要一个图标一直旋转。除非您有用户抱怨,否则您当前的解决方案应该可以正常工作。无论如何,进度条的全部要点是让程序告诉用户“我还没死”。 – Thomas 2012-02-15 22:04:06

+1

这里有一个或两个... http://stackoverflow.com/questions/2685435/cooler-ascii-spinners/2685509#2685509 – 2012-02-15 22:11:01

回答

3

下面一个例子来说明一个旋转的进度条和传统风格:

import java.io.*; 
public class ConsoleProgressBar { 
    public static void main(String[] argv) throws Exception{ 
     System.out.println("Rotating progress bar"); 
     ProgressBarRotating pb1 = new ProgressBarRotating(); 
     pb1.start(); 
     int j = 0; 
     for (int x =0 ; x < 2000 ; x++){ 
     // do some activities 
     FileWriter fw = new FileWriter("c:/temp/x.out", true); 
     fw.write(j++); 
     fw.close(); 
     } 
     pb1.showProgress = false; 
     System.out.println("\nDone " + j); 

     System.out.println("Traditional progress bar"); 
     ProgressBarTraditional pb2 = new ProgressBarTraditional(); 
     pb2.start(); 
     j = 0; 
     for (int x =0 ; x < 2000 ; x++){ 
     // do some activities 
     FileWriter fw = new FileWriter("c:/temp/x.out", true); 
     fw.write(j++); 
     fw.close(); 
     } 
     pb2.showProgress = false; 
     System.out.println("\nDone " + j); 
    } 
} 

class ProgressBarRotating extends Thread { 
    boolean showProgress = true; 
    public void run() { 
    String anim= "|/-\\"; 
    int x = 0; 
    while (showProgress) { 
     System.out.print("\r Processing " + anim.charAt(x++ % anim.length())); 
     try { Thread.sleep(100); } 
     catch (Exception e) {}; 
    } 
    } 
} 

class ProgressBarTraditional extends Thread { 
    boolean showProgress = true; 
    public void run() { 
    String anim = "====================="; 
    int x = 0; 
    while (showProgress) { 
     System.out.print("\r Processing " 
      + anim.substring(0, x++ % anim.length()) 
      + " "); 
     try { Thread.sleep(100); } 
     catch (Exception e) {}; 
    } 
    } 
} 
0

如果您知道需要完成多少工作以及剩余(或完成)多少工作,则可以考虑打印出完整的百分比条形图类型的进度条。根据这个项目的范围,这可能只是在ascii,或者你也可以考虑使用图形。

2

尝试使用回车,\r

0

在GUI应用程序中,该方法通常是旋转圆或弹跳/循环进度条。我记得使用斜线,管和连字符来创建一个旋转的动画许多控制台应用程序:

\ |/- 

你也可以在括号中使用弹跳字符:

[-----*-----] 

当然,像其他答复中提到,您希望使用return返回到行首,然后打印进度,覆盖现有输出。

编辑:威尔在评论中提到的许多冷却器选项:

Cooler ASCII Spinners?