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

Jus*_*yer 4 java jar batch-file

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

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

我不希望它分布在多行上,如下所示:

[aaaaaccccccccccccccc] 25%
[aaaaaaaaaacccccccccc] 50%
[aaaaaaaaaaaaaaaccccc] 75%
Run Code Online (Sandbox Code Playgroud)

保持干净的位置会让事情变得更干净、更友好。

非常感谢,

查士丁

编辑:

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

  1. 适用于 C++,不适用于 Java
  2. 在Java中似乎效率不高,必须在循环中退格每一行?

在 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;
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

[||||||||||||||||....] 80%(.=空格)

Bri*_*n S 5

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

有以下三项规定:

  1. 您不能超出控制台宽度(80 个字符宽度可能是一个安全的假设)
  2. 每次迭代您必须打印至少与前一次迭代一样多的可见字符。
  3. 当您想继续前进时(当您完成加载栏或其他内容时),您需要以换行符开头,否则您将开始用新文本覆盖现有加载栏。

所以,沿着这些思路:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

假设您计算的负载百分比是单调递增的(换句话说,它不像 Windows 负载栏那样在 3 秒内从 20% 到 110% 再到 1%),您不必担心确保你的下一个输出等于或长于你之前的输出,因为这永远是真的。但是,在这种情况下,您可以在“ ”后添加两个空格来处理它%


归档时间:

查看次数:

4337 次

最近记录:

4 年,10 月 前