wake-up-neo.com

Konsolenbasierter Fortschritt in Java

Gibt es eine einfache Möglichkeit, einen laufenden Prozentsatz für einen Prozess in Java zu implementieren, der in der Konsole angezeigt wird? Ich habe einen prozentualen Datentyp (doppelt), den ich während eines bestimmten Prozesses generiert habe. Aber kann ich ihn in das Konsolenfenster erzwingen und aktualisieren lassen, anstatt für jede neue Aktualisierung des Prozentsatzes nur eine neue Zeile zu drucken? Ich habe darüber nachgedacht, ein Cls zu pushen und zu aktualisieren, weil ich in einer Windows-Umgebung arbeite, aber ich hoffte, dass Java über eine integrierte Funktion verfügt. Alle Vorschläge wurden begrüßt! Vielen Dank!

33
Monster

Sie können einen Wagenrücklauf \r ausdrucken, um den Cursor an den Zeilenanfang zu setzen.

Beispiel:

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) {}
  }
}
52
laalto

Ich benutze folgenden Code: 

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

Das Ergebnis:  enter image description here

9
Mike Shauneu

Ich habe ein solches Paket in Java geschrieben.

https://github.com/ctongfei/progressbar

7
Tongfei Chen

Ich glaube nicht, dass es eine integrierte Funktion gibt, um das zu tun, wonach Sie suchen. 

Es gibt eine Bibliothek, die es tut (JLine). 

Sehen Sie dieses Tutorial

6
Glen

Ich bin mir ziemlich sicher, dass es keine Möglichkeit gibt, etwas zu ändern, das die Konsole bereits gedruckt hat, da Java die Konsole (Standardausgabe) als PrintStream betrachtet.

4
David Johnstone

Ich weiß nicht, was in Java integriert ist, aber Sie können Terminalsteuerungscodes verwenden, um beispielsweise den Cursor neu zu positionieren. Einige Details hier: http://www.termsys.demon.co.uk/vtansi.htm

2
Tom Jefferys

Spät für die Party, aber hier ist eine Antwort:

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

Denken Sie daran, System.out.print() anstelle von System.out.println() zu verwenden.

0
victorantunes

Löschen Sie die Konsole, indem Sie den os-spezifischen Befehl ausführen und dann den neuen Prozentsatz drucken

0
Thejesh GN
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;
    }
}
0
Elphara77