web-dev-qa-db-fra.com

Java: mise à jour du texte dans la ligne de commande sans nouvelle ligne

Je voudrais ajouter un indicateur de progression à une ligne de commande Java program.

Par exemple, si j'utilise wget, cela montre:

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

Est-il possible d'avoir un indicateur de progression qui se met à jour sans ajouter une nouvelle ligne en bas?

Merci.

42
Tom Marthenal

Tout d'abord, lorsque vous écrivez, n'utilisez pas writeln (). Utilisez write (). Deuxièmement, vous pouvez utiliser un "\ r" pour le retour chariot sans utiliser\n qui est une nouvelle ligne. Le retour chariot devrait vous remettre au début de la ligne.

45
rfeak

J'utilise le code suivant:

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

Le résultat: enter image description here

53
Mike Shauneu