基于控制台的Java进度

Mon*_*ter 35 java console refresh progress-bar

是否有简单的方法来实现Java中进程的滚动百分比,以便在控制台中显示?我有一个在特定过程中生成的百分比数据类型(double),但是我可以强制它到控制台窗口并刷新它,而不是仅为每个新更新打印一个新行吗?我正在考虑推动cls和更新,因为我在Windows环境中工作,但我希望Java具有某种内置功能.欢迎所有建议!谢谢!

laa*_*lto 53

您可以打印回车符\r将光标放回行的开头.

例:

public class ProgressDemo {
  static void updateProgress(double progressPercentage) {
    final int width = 50; // progress bar width in chars

    System.out.print("\r[");
    int i = 0;
    for (; i <= (int)(progressPercentage*width); i++) {
      System.out.print(".");
    }
    for (; i < width; i++) {
      System.out.print(" ");
    }
    System.out.print("]");
  }

  public static void main(String[] args) {
    try {
      for (double progressPercentage = 0.0; progressPercentage < 1.0; progressPercentage += 0.01) {
        updateProgress(progressPercentage);
        Thread.sleep(20);
      }
    } catch (InterruptedException e) {}
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我试过了.它不起作用.(在Eclipse中测试过.) (5认同)

Mik*_*neu 11

我使用以下代码:

public static void main(String[] args) {
    long total = 235;
    long startTime = System.currentTimeMillis();

    for (int i = 1; i <= total; i = i + 3) {
        try {
            Thread.sleep(50);
            printProgress(startTime, total, i);
        } catch (InterruptedException e) {
        }
    }
}


private static void printProgress(long startTime, long total, long current) {
    long eta = current == 0 ? 0 : 
        (total - current) * (System.currentTimeMillis() - startTime) / current;

    String etaHms = current == 0 ? "N/A" : 
            String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(eta),
                    TimeUnit.MILLISECONDS.toMinutes(eta) % TimeUnit.HOURS.toMinutes(1),
                    TimeUnit.MILLISECONDS.toSeconds(eta) % TimeUnit.MINUTES.toSeconds(1));

    StringBuilder string = new StringBuilder(140);   
    int percent = (int) (current * 100 / total);
    string
        .append('\r')
        .append(String.join("", Collections.nCopies(percent == 0 ? 2 : 2 - (int) (Math.log10(percent)), " ")))
        .append(String.format(" %d%% [", percent))
        .append(String.join("", Collections.nCopies(percent, "=")))
        .append('>')
        .append(String.join("", Collections.nCopies(100 - percent, " ")))
        .append(']')
        .append(String.join("", Collections.nCopies(current == 0 ? (int) (Math.log10(total)) : (int) (Math.log10(total)) - (int) (Math.log10(current)), " ")))
        .append(String.format(" %d/%d, ETA: %s", current, total, etaHms));

    System.out.print(string);
}
Run Code Online (Sandbox Code Playgroud)

结果: 在此输入图像描述

  • 哇!谢谢!对我来说,工作真的很好,而不是标记答案. (2认同)

Ton*_*hen 7

我用Java编写了这样的包.

https://github.com/ctongfei/progressbar


Gle*_*len 6

我认为没有内置的功能可以满足您的需求.

有一个库(JLine).

请参阅本教程