Question

J'ai un programme Java en cours d'exécution en mode ligne de commande. Je voudrais afficher une barre de progression, indiquant le pourcentage du travail. Le même genre de barre de progression vous verriez en utilisant wget sous unix. Est-ce possible?

Était-ce utile?

La solution

Je l'ai mis en œuvre ce genre de chose auparavant. Son pas tant de java, mais ce que les personnages à envoyer à la console.

La clé est la différence entre et \n \r. Va au <=> début d'une nouvelle ligne. Mais est juste <=> retour chariot -. Il remonte au début de la même ligne

Donc, la chose à faire est d'imprimer votre barre de progression, par exemple, en imprimant la chaîne

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

Sur la prochaine tic-tac de la barre de progression, remplacer la même ligne avec une barre plus. (Parce que nous utilisons \ r, nous restons sur la même ligne) Par exemple:

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

Ce que vous devez vous rappeler de le faire, est lorsque vous avez terminé, si vous puis juste imprimer

"done!\n"

Vous pouvez toujours avoir des ordures 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 le retirer de la ligne. Tels que:

"done             |\n"

L'espoir qui aide.

Autres conseils

Il est https://github.com/ctongfei/progressbar , Licence: MIT

Barre de progression simple de la console. l'écriture de la barre de progression fonctionne maintenant sur un autre thread.

Menlo, Fira Mono, code source Pro ou SF Mono sont recommandés pour les effets visuels optimaux.

Pour Consolas ou Andale Mono polices, utilisez ProgressBarStyle.ASCII (voir ci-dessous) parce que les glyphes de boîte de dessin ne sont pas alignés correctement dans ces polices.

Maven:

<dependency>
  <groupId>me.tongfei</groupId>
  <artifactId>progressbar</artifactId>
  <version>0.5.5</version>
</dependency>

Utilisation:

ProgressBar pb = new ProgressBar("Test", 100); // name, initial max
 // Use ProgressBar("Test", 100, ProgressBarStyle.ASCII) if you want ASCII output style
pb.start(); // the progress bar starts timing
// Or you could combine these two lines like this:
//   ProgressBar pb = new ProgressBar("Test", 100).start();
some loop {
  ...
  pb.step(); // step by 1
  pb.stepBy(n); // step by n
  ...
  pb.stepTo(n); // step directly to n
  ...
  pb.maxHint(n);
  // reset the max of this progress bar as n. This may be useful when the program
  // gets new information about the current progress.
  // Can set n to be less than zero: this means that this progress bar would become
  // indefinite: the max would be unknown.
  ...
  pb.setExtraMessage("Reading..."); // Set extra message to display at the end of the bar
}
pb.stop() // stops the progress bar

J'ai trouvé le code suivant pour fonctionner correctement. Il écrit octets dans la mémoire tampon de sortie. Peut-être que les méthodes utilisant un écrivain comme la méthode remplace les occurrences System.out.println() de à \r pour correspondre à la ligne \n native de la cible de fin (sinon correctement configuré).

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

J'ai fait un pourcentage de progression nu pour vérifier le reste fichier de téléchargement.

J'appelle la méthode périodiquement dans mon téléchargement de fichiers pour vérifier le total de fichiers et la taille restante et présente que, dans %.

Il peut être utilisé à d'autres fins de tâches ainsi.

Test et exemple de sortie

progressPercentage(0, 1000);
[----------] 0%

progressPercentage(10, 100);
[*---------] 10%

progressPercentage(500000, 1000000);
[*****-----] 50%

progressPercentage(90, 100);
[*********-] 90%

progressPercentage(1000, 1000);
[**********] 100%

Test avec boucle

for (int i = 0; i <= 200; i = i + 20) {
    progressPercentage(i, 200);
    try {
        Thread.sleep(500);
    } catch (Exception e) {
    }
}

peut être facilement modifié la méthode:

public static void progressPercentage(int remain, int total) {
    if (remain > total) {
        throw new IllegalArgumentException();
    }
    int maxBareSize = 10; // 10unit for 100%
    int remainProcent = ((100 * remain) / total) / maxBareSize;
    char defaultChar = '-';
    String icon = "*";
    String bare = new String(new char[maxBareSize]).replace('\0', defaultChar) + "]";
    StringBuilder bareDone = new StringBuilder();
    bareDone.append("[");
    for (int i = 0; i < remainProcent; i++) {
        bareDone.append(icon);
    }
    String bareRemain = bare.substring(remainProcent, bare.length());
    System.out.print("\r" + bareDone + bareRemain + " " + remainProcent * 10 + "%");
    if (remain == total) {
        System.out.print("\n");
    }
}

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

En gros, vous voulez écrire le caractère échapper au \r début de votre message qui, le curseur pour revenir au début de la ligne (saut de ligne) sans se déplacer à 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();

    }

Voici une version modifiée de ce qui précède:

private static boolean loading = true;
private static synchronized void loading(String msg) throws IOException, InterruptedException {
    System.out.println(msg);
    Thread th = new Thread() {
        @Override
        public void run() {
            try {
                System.out.write("\r|".getBytes());
                while(loading) {
                    System.out.write("-".getBytes());
                    Thread.sleep(500);
                }
                System.out.write("| Done \r\n".getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    th.start();
}

... et principal:

loading("Calculating ...");

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

J'utilise un « rebond » barre de progression quand je dois retarder un outil pour éviter une condition de course.

private void delay(long milliseconds) {
    String bar = "[--------------------]";
    String icon = "%";

    long startTime = new Date().getTime();
    boolean bouncePositive = true;
    int barPosition = 0;

    while((new Date().getTime() - startTime) < milliseconds) {
        if(barPosition < bar.length() && barPosition > 0) {
            String b1 = bar.substring(0, barPosition);
            String b2 = bar.substring(barPosition);
            System.out.print("\r Delaying: " + b1 + icon + b2);
            if(bouncePositive) barPosition++;
            else barPosition--;
        } if(barPosition == bar.length()) {
            barPosition--;
            bouncePositive = false;
        } if(barPosition == 0) {
            barPosition++;
            bouncePositive = true;
        }

        try { Thread.sleep(100); }
        catch (Exception e) {}
    }
    System.out.print("\n");
}

J'ai récemment fait face au même problème, vous pouvez vérifier mon code: Je l'ai mis pour un # sur 5%, que vous pouvez modifier ultérieurement.

public static void main (String[] args) throws java.lang.Exception
{
    int i = 0;
    while(i < 21) {
        System.out.print("[");
        for (int j=0;j<i;j++) {
            System.out.print("#");
        }

        for (int j=0;j<20-i;j++) {
            System.out.print(" ");
        }

        System.out.print("] "+  i*5 + "%");
        if(i<20) {
            System.out.print("\r");
            Thread.sleep(300);
        }
        i++;
    }
    System.out.println();
}
public static void main(String[] argv) throws Exception{


    System.out.write("\r".getBytes());
    int percentage =10;
    while(percentage <= 100) {
        String temp =generateStars(percentage);
        System.out.write(temp.getBytes());
        System.out.print("\b\b\b");
        percentage = percentage+10;
        Thread.sleep(500);
    }
}

    public static String generateStars(int percentage)
    {
        int startsNum = percentage / 4;
        StringBuilder builder = new StringBuilder();
        while(startsNum >= 0)
        {
        builder.append("*");
        startsNum--;
        }
        builder.append(percentage+"%");
        return builder.toString();
    }

Un peu refondus et mis à jour @ méthode de Maytham-ɯɐɥʇʎɐɯ. Maintenant, il est supportant une taille arbitraire de la barre de progression:

    public static void progressPercentage(int done, int total) {
        int size = 5;
        String iconLeftBoundary = "[";
        String iconDone = "=";
        String iconRemain = ".";
        String iconRightBoundary = "]";

        if (done > total) {
            throw new IllegalArgumentException();
        }
        int donePercents = (100 * done) / total;
        int doneLength = size * donePercents / 100;

        StringBuilder bar = new StringBuilder(iconLeftBoundary);
        for (int i = 0; i < size; i++) {
            if (i < doneLength) {
                bar.append(iconDone);
            } else {
                bar.append(iconRemain);
            }
        }
        bar.append(iconRightBoundary);

        System.out.print("\r" + bar + " " + donePercents + "%");

        if (done == total) {
            System.out.print("\n");
        }
    }
public class ProgressBar
{
    private int max;

    public ProgressBar(int max0) {
        max = max0;
        update(0);
    }

    public void update(int perc) {
        String toPrint = "|";
        for(int i = 0; i < max; i++) {
            if(i <= (perc + 1))
                toPrint += "=";
            else
                toPrint += " ";
        }

        if(perc >= max)
            Console.print("\r");
        else
            Console.print(toPrint + "|\r");
    }
}
public class Main {

    public static void main(String[] args) throws Exception {

        System.out.println("Loading : ");
            int count =1;
            for(int j=1;j<150;j++){

                System.out.print("\r");
                if(count==1){
                    System.out.print("/");
                    count++;
                }
                else if(count==2){
                    System.out.print("|");
                    count++;
                }
                else if(count==3){
                    System.out.print("-");
                    count++;
                }
                else if(count==4){
                    System.out.print("\\");
                    count++;
                }
                else if(count==5){
                    System.out.print("|");
                    count++;
                }
                else
                    count = 1;
            Thread.sleep(200);
        }

        }

    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top