java命令行上的非确定性进度条

java命令行上的非确定性进度条,java,console,progress-bar,Java,Console,Progress Bar,我有一个控制台应用程序,我想在命令行上放置一个不确定的进度条,同时完成一些繁重的计算。目前,我只是在while循环中为每个迭代打印一个“.”,如下所示: while (continueWork){ doLotsOfWork(); System.out.print('.'); } ,但是我想知道是否有人有更好的想法,因为如果循环中有很多迭代,这可能会有点恼人。 < P>如果你知道有多少工作要做,剩下多少(或者做了多少),你可以考虑打印出百分之一个完整的条形图进度条。根据本项目的范

我有一个控制台应用程序,我想在命令行上放置一个不确定的进度条,同时完成一些繁重的计算。目前,我只是在while循环中为每个迭代打印一个“.”,如下所示:

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

,但是我想知道是否有人有更好的想法,因为如果循环中有很多迭代,这可能会有点恼人。

< P>如果你知道有多少工作要做,剩下多少(或者做了多少),你可以考虑打印出百分之一个完整的条形图进度条。根据本项目的范围,这可以简单地在<代码> ASCII 中,或者您也可以考虑使用图形。

尝试使用回车,<代码> \r .< /P> < P>在GUI应用程序中,该方法通常是一个旋转圆或弹跳/循环进度条。我记得许多控制台应用程序使用斜杠、管道和连字符创建旋转动画:

\ | / - 
也可以在括号中使用反弹字符:

[-----*-----]
当然,正如另一个答案所提到的,您希望使用return返回到行的开头,然后打印进度,覆盖现有的输出

编辑:威尔在评论中提到了许多更酷的选项:


下面是一个显示旋转进度条和传统样式的示例:

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) {};
    }
  }
}
import java.io.*;
公共类控制台ProgressBar{
公共静态void main(字符串[]argv)引发异常{
System.out.println(“旋转进度条”);
ProgressBarRotating pb1=新的ProgressBarRotating();
pb1.start();
int j=0;
对于(int x=0;x<2000;x++){
//做一些活动
FileWriter fw=新的FileWriter(“c:/temp/x.out”,true);
fw.write(j++);
fw.close();
}
pb1.showProgress=false;
System.out.println(“\nDone”+j);
System.out.println(“传统进度条”);
ProgressBarTraditional pb2=新的ProgressBarTraditional();
pb2.start();
j=0;
对于(int x=0;x<2000;x++){
//做一些活动
FileWriter fw=新的FileWriter(“c:/temp/x.out”,true);
fw.write(j++);
fw.close();
}
pb2.showProgress=false;
System.out.println(“\nDone”+j);
}
}
类ProgressBarRotating扩展线程{
布尔值showProgress=true;
公开募捐{
字符串anim=“|/-\”;
int x=0;
while(showProgress){
System.out.print(“\r Processing”+anim.charAt(x++%anim.length());
试试{Thread.sleep(100);}
捕获(例外e){};
}
}
}
类ProgressBarTraditional扩展线程{
布尔值showProgress=true;
公开募捐{
字符串动画=“============================”;
int x=0;
while(showProgress){
系统输出打印(“\r处理”
+动画子字符串(0,x++%anim.length())
+ " "); 
试试{Thread.sleep(100);}
捕获(例外e){};
}
}
}

始终存在经典的指数进度条。第一次迭代时填充一半,第二次迭代时再填充一半(75%),依此类推。或者是“沙漏”方法,你只需要一个图标在整个时间里旋转。除非有用户抱怨,否则您当前的解决方案应该可以正常工作。进度条的整个要点是让程序告诉用户
我还没有死。
无论如何。这里有一两个。。。