Java:在命令行中更新文本而不使用新行

Tom*_*nal 38 java console console-application

我想在命令行Java程序中添加进度指示器.

例如,如果我使用的是wget,它会显示:

71% [===========================>           ] 358,756,352 51.2M/s  eta 3s
Run Code Online (Sandbox Code Playgroud)

是否可以在没有向底部添加新行的情况下更新进度指示器?

谢谢.

Mik*_*neu 49

我使用以下代码:

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((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)

结果: 在此输入图像描述

  • @PhDeveloper 是的,Eclipse 坏了。在 100 篇关于控制台的文章中,您会发现一条注释:“适用于除 Eclipse 之外的所有终端”。 (2认同)

rfe*_*eak 41

首先,当你写,不要使用writeln().使用write().其次,您可以使用"\ r"来回车而不使用\n这是一个新行.回车应该让你回到线的开头.

  • 但是,如果文本的长度可能缩小(例如,显示ETA所需的位数减少),请记住在旧字符上写入空格,以便它们不再显示.编辑:此外,请记住执行System.out.flush()以确保文本实际显示(例如在行缓冲终端上). (9认同)
  • @CardinalSystem-是否有机会使用Eclipse控制台?显然,它无法正确处理\ r。它将在java cli中运行。 (2认同)