有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

控制台Java:不使用新行更新命令行中的文本

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

例如,如果我正在使用wget,它会显示:

71% [===========================>           ] 358,756,352 51.2M/s  eta 3s

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

谢谢


共 (2) 个答案

  1. # 1 楼答案

    首先,在编写时,不要使用writeln()。使用write()。第二,可以使用“\r”回车,而不使用新行。回车应该会让你回到队伍的开头

  2. # 2 楼答案

    我使用以下代码:

    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);
    }
    

    结果是: enter image description here