在命令提示符下运行Java时基于文本的加载栏?

时间:2010-07-12 03:25:43

标签: java batch-file jar

我只是想知道在使用批处理文件运行程序时是否有办法使用System.out.println();或其他方法来创建一个很酷的加载栏。

这里真正的问题是如何使这个条看起来好像只在一行上打印。

我不希望它分散在多行如下:

[aaaaaccccccccccccccc] 25%
[aaaaaaaaaacccccccccc] 50%
[aaaaaaaaaaaaaaaccccc] 75%

保持干净利落的人会使事情更清洁,更友好。

非常感谢,

瑞斯蒂昂

修改

确定。我设法在这里找到了这个链接:How to animate the command line?,但答案是:

  1. 适用于C ++,而不是Java
  2. 在Java中看起来效率不高,不得不在循环中对每一行进行退格处理?
  3. 在Java中有更好的方法吗?

    修改

    这就是我最终的目标:

    static final int PROGRESSBAR_LENGTH = 20;
    
    public static void drawProgressBar(int numerator, int denominator) {
        int percent = (int) (((double) numerator / (double) denominator) * 100);
    
        String bar = "[";
        int lines = round((PROGRESSBAR_LENGTH * numerator) / denominator);
        int blanks = PROGRESSBAR_LENGTH - lines;
    
        for (int i = 0; i < lines; i++)
            bar += "|";
    
        for (int i = 0; i < blanks; i++)
            bar += " ";
    
        bar += "] " + percent + "%";
    
        System.out.print(bar + "\r");
    }
    
    private static int round(double dbl) {
        int noDecimal = (int) dbl;
        double decimal = dbl - noDecimal;
    
        if (decimal >= 0.5)
            return noDecimal + 1;
        else
            return noDecimal;
    }
    

    示例输出:

    [||||||||||||||||....] 80%(。's = space)

3 个答案:

答案 0 :(得分:4)

作为打印退格字符的替代方法,您可以使用回车符:13(十进制),0xD(十六进制)或\ r(转义字符)。

有三个规定:

  1. 您不能超出控制台宽度(80个字符宽度可能是一个安全的假设)
  2. 每次迭代时,您必须打印的字符数与上一次迭代次数相同。
  3. 当你想要继续前进时(当你完成装载栏或其他任何事情时),你需要使用换行符,否则你将开始用新文本覆盖现有的加载栏。
  4. 所以,沿着这些方向:

    public static void loadMyProgram() {
        while(programStillLoading) {
            doSomeLoading();
            double loadFraction = howCloseToDone(); // A number between 0 and 1
    
            System.out.print("[");
            int i = 0;
            for( ; i < (int)(loadFraction * 20); i++)
                System.out.print("=");
            for( ; i < 20; i++)
                System.out.print(" ");
            System.out.print("] " + (int)(loadFraction * 100) + "%");
    
            System.out.print((char)13);
            //System.out.print((char)0xD); // Same as above, but in hex
            //System.out.print("\r"); // Same as above, but as the symbol
        }
    
        System.out.println();
    }
    

    以上内容将打印[<bar>] <percent>%,其中<bar>0..p'=',然后是0..(20-p)''。它将保持一条线。

    假设您对负载百分比的计算是单调增加的(换句话说,它不像Windows加载条那样,在3秒的时间内从20%变为110%到1%),你就不要我必须担心确保你的下一个输出等于或长于你以前的输出,因为这总是正确的。但是,在这种情况下,您可以在“%”之后用两个空格来处理它。

答案 1 :(得分:0)

我使用退格方法完成了这项工作 - 似乎工作正常。

只需使用System.out.print()代替System.out.println() - 这样您就不会获得回车。

您需要跟踪需要打印的退格数量,但它可以正常工作。

BTW - 要在java中打印退格键,请使用:

System.out.print("\b");

答案 2 :(得分:0)

这可能是一个开始的地方。

用法:

ProgressBar pb = new PorgressBar(10,1);
pb.start();
while (loadingStuff) {
  doStuff();
  pb.update();
}
pb.finish();

班级:

public class ProgressBar {

      private static String[] s;
      private int pos, inc, size;

      public PorgressBar(int size, int increment) {
        this.size = size;
        this.increment = increment;
        s = new String[size+2];  
        Arrays.fill(s,"a");
        s[0] = "[";
        s[size+1] = "]";
      }

      public void update() {
          System.out.println('\r');
          if (pos+inc<size+2) {
              Arrays.fill(s,pos,pos+inc,"c");
              pos += inc;
          }
          for (String ch : s) {
              System.out.print(ch);
          }  
      }

      public void finish() {
          System.out.println();
      }
}