140 votes

Barre de progression de la ligne de commande en Java

J'ai un programme Java qui fonctionne en mode ligne de commande. Je voudrais afficher une barre de progression, montrant le pourcentage du travail effectué. Le même type de barre de progression que vous verriez en utilisant wget sous unix. Cela est-il possible ?

0 votes

Je ne connais pas la réponse à votre question spécifique, mais vous pourriez commencer par consulter les bibliothèques mentionnées dans cette question : stackoverflow.com/questions/435740/

0 votes

Merci. Les bibliothèques citées ici concernent davantage l'analyse des arguments de la ligne de commande, plutôt que l'affichage dans la console. Mais merci quand même.

8 votes

C'est le sujet. L'OP demande si c'est possible, pas une recommandation de bibliothèque (du moins dans la version actuelle).

190voto

Matthias Wandel Points 3022

J'ai déjà mis en place ce genre de choses auparavant. Il ne s'agit pas tant de Java que des caractères à envoyer à la console.

La clé est la différence entre \n y \r . \n va au début d'une nouvelle ligne. Mais \r es sólo retour à la ligne - il revient au début de la même ligne.

La chose à faire est donc d'imprimer votre barre de progression, par exemple, en imprimant la chaîne de caractères

"|========        |\r"

Au prochain tic-tac de la barre de progression, écrasez la même ligne avec une barre plus longue (parce que nous utilisons la fonction \r (nous restons sur la même ligne) Par exemple :

"|=========       |\r"

Ce que vous devez vous rappeler de faire, c'est que lorsque vous avez terminé, si vous imprimez juste

"done!\n"

Il se peut que vous ayez encore des déchets de la barre de progression sur la ligne. Donc, une fois que vous avez terminé avec la barre de progression, assurez-vous d'imprimer suffisamment d'espaces pour les supprimer de la ligne. Par exemple :

"done             |\n"

J'espère que cela vous aidera.

0 votes

Est-ce vraiment multiplateforme ? Il se comportera probablement bien sous Windows et Linux, mais qu'en est-il des Macs ? Je n'en ai pas, donc je ne peux pas l'essayer...

3 votes

@RaduMurzea OS X est un OS *NIX, donc si ça marche sur Linux, ça marchera sur OS X (ce n'est pas vrai pour tout, mais c'est vrai ici).

4 votes

Merci ! Cependant, cela ne fonctionne pas avec ant (essayé à la fois sur linux et osx ; fonctionne bien en invoquant java directement). Quelqu'un a une idée ?

23voto

keesj Points 61

J'ai trouvé le code suivant qui fonctionne correctement. Il écrit des octets dans le tampon de sortie. Peut-être que cette méthode utilise un écrivain comme le System.out.println() remplace les occurrences de \r a \n pour correspondre à la terminaison de ligne native de la cible (si elle n'est pas configurée correctement).

public class Main{
    public static void main(String[] arg) throws Exception {
        String anim= "|/-\\";
        for (int x =0 ; x < 100 ; x++) {
            String data = "\r" + anim.charAt(x % anim.length()) + " " + x;
            System.out.write(data.getBytes());
            Thread.sleep(100);
        }
    }
}

5voto

Eoin Campbell Points 22861

Exemple de C# mais je suppose que c'est la même chose pour System.out.print en Java. N'hésitez pas à me corriger si je me trompe.

En gros, vous voulez écrire le \r au début de votre message qui fera revenir le curseur au début de la ligne (Line Feed) sans passer à la ligne suivante.

    static string DisplayBar(int i)
    {
        StringBuilder sb = new StringBuilder();

        int x = i / 2;
        sb.Append("|");
        for (int k = 0; k < 50; k++)
            sb.AppendFormat("{0}", ((x <= k) ? " " : "="));
        sb.Append("|");

        return sb.ToString();
    }

    static void Main(string[] args)
    {
        for (int i = 0; i <= 100; i++)
        {
            System.Threading.Thread.Sleep(200);
            Console.Write("\r{0} {1}% Done", DisplayBar(i), i);
        }

        Console.ReadLine();

    }

0 votes

Bel exemple, qui sera certainement utile. Merci.

0 votes

Magnifique ! Merci. Fonctionne comme un charmeur. Facile à lire. Lovely

4voto

DocWiki Points 941

Jetez un coup d'œil à cette page : Barre de progression de la ligne de commande

http://nakkaya.com/2009/11/08/command-line-progress-bar/

2voto

kgiannakakis Points 62727

Cela serait possible avec une bibliothèque Java Curses. Ce site c'est ce que j'ai trouvé. Je ne l'ai pas utilisé moi-même et je ne sais pas s'il est multiplateforme.

0 votes

Les malédictions sont peut-être un peu trop lourdes pour l'utilisation facile dont j'ai besoin, mais c'est une piste. Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X