Есть ли простой способ реализовать процент проката для процесса в Java, который будет отображаться в консоли? У меня есть процентный тип данных (двойной), который я генерировал во время определенного процесса, но могу ли я заставить его в окне консоли и обновить его вместо того, чтобы просто печатать новую строку для каждого нового обновления в процентах? Я думал о том, чтобы нажимать cls и обновлять, потому что я работаю в среде Windows, но я надеялся, что у Java есть какая-то встроенная возможность. Все предложения приветствуются! Спасибо!
Прогресс на основе консоли в Java
Ответ 1
Вы можете напечатать возврат каретки \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) {}
  }
}
Ответ 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);
}
Ответ 3
Я не думаю, что есть встроенная возможность делать то, что вы ищете.
Существует библиотека, которая сделает это (JLine).
Смотрите учебник
Ответ 4
Я написал такой пакет на Java.
Ответ 5
Я уверен, что нет способа изменить что-либо, что консоль уже напечатала, потому что Java считает, что консоль (стандартная версия) является PrintStream.
Ответ 6
Не знаю ни о чем встроенном в java, но вы можете использовать коды управления терминалом, чтобы делать что-то вроде перестановки курсора. Некоторые подробности здесь: http://www.termsys.demon.co.uk/vtansi.htm
Ответ 7
Очистите консоль, выполнив команду os, а затем напечатайте новый процент
Ответ 8
import java.util.Random;
public class ConsoleProgress {
    private static String CURSOR_STRING = "0%.......10%.......20%.......30%.......40%.......50%.......60%.......70%.......80%.......90%.....100%";
    private static final double MAX_STEP = CURSOR_STRING.length() - 1;
    private double max;
    private double step;
    private double cursor;
    private double lastCursor;
    public static void main(String[] args) throws InterruptedException {
        // ---------------------------------------------------------------------------------
        int max = new Random().nextInt(400) + 1;
        // ---------------------------------------------------------------------------------
        // Example of use :
        // ---------------------------------------------------------------------------------
        ConsoleProgress progress = new ConsoleProgress("Progress (" + max + ") : ", max);
        for (int i = 1; i <= max; i++, progress.nextProgress()) {
            Thread.sleep(3L); // a task with no prints
        }
    }
    public ConsoleProgress(String title, int maxCounts) {
        cursor = 0.;
        max = maxCounts;
        step = MAX_STEP / max;
        System.out.print(title);
        printCursor();
        nextProgress();
    }
    public void nextProgress() {
        printCursor();
        cursor += step;
    }
    private void printCursor() {
        int intCursor = (int) Math.round(cursor) + 1;
        System.out.print(CURSOR_STRING.substring((int) lastCursor, intCursor));
        if (lastCursor != intCursor && intCursor == CURSOR_STRING.length())
            System.out.println(); // final print
        lastCursor = intCursor;
    }
}
Ответ 9
Поздно для вечеринки, но вот ответ:
public static String getSingleLineProgress(double progress) {
    String progressOutput = "Progress: |";
    String padding = Strings.padEnd("", (int) Math.ceil(progress / 5), '=');
    progressOutput += Strings.padEnd(padding, 0, ' ') + df.format(progress) + "%|\r";
    if (progress == 100.0D) {
        progressOutput += "\n";
    }
    return progressOutput;
}
Не забудьте использовать System.out.print() вместо System.out.println()
Ответ 10
Это можно сделать довольно просто. Просто используйте:
System.out.print("*");
вместо
System.out.println("*");
который печатает символ newLine после каждой строки.

