72 votes

Comment puis-je imprimer sur la même ligne ?

Je veux imprimer une barre de progression comme ceci :

[#                    ] 1%
[##                   ] 10%
[##########           ] 50%

Mais ils devraient tous être imprimés sur la même ligne dans le terminal au lieu d'une nouvelle. Ce que je veux dire par là, c'est que chaque nouvelle ligne devrait remplacer la précédente, il ne s'agit pas d'utiliser la commande print() au lieu de println() .

Comment puis-je faire cela en Java ?

117voto

NPE Points 169956

Formatez votre chaîne comme suit :

[#                    ] 1%\r

Notez le \r caractère. Il s'agit de ce que l'on appelle retour à la ligne qui ramènera le curseur au début de la ligne.

Enfin, assurez-vous d'utiliser

System.out.print()

et non

System.out.println()

20 votes

La séquence d'échappement du retour chariot \r ne fonctionne pas dans Eclipse à cause d'un problème de type vieux bug signalé en 2004 et pas encore corrigé dans la dernière version d'Eclipse (4.3.2 Kepler)

0 votes

@Sortofabeginner : En un mot, oui.

2 votes

@Krige : La même chose s'applique au volet de sortie dans Netbeans 8, du moins sur mon Mac. Le site \r est interprété comme un saut de ligne. Les codes VT100 et les backspaces ne fonctionnent pas non plus correctement, malheureusement.

15voto

Kirill Points 1620

Sous Linux, il existe différentes séquences d'échappement pour le terminal de contrôle. Par exemple, il existe une séquence d'échappement spéciale pour effacer une ligne entière : \33[2K et pour déplacer le curseur à la ligne précédente : \33[1A . Il suffit donc d'imprimer ce code à chaque fois que vous devez rafraîchir la ligne. Voici le code qui imprime Line 1 (second variant) :

System.out.println("Line 1 (first variant)");
System.out.print("\33[1A\33[2K");
System.out.println("Line 1 (second variant)");

Il existe des codes pour la navigation du curseur, l'effacement de l'écran, etc.

Je pense qu'il y a quelques bibliothèques qui aident avec cela ( ncurses ?).

14voto

Amndeep7 Points 357

Tout d'abord, je tiens à m'excuser d'avoir remis cette question sur le tapis, mais j'ai pensé qu'elle méritait une autre réponse.

Derek Schultz a en quelque sorte raison. Le \b Le caractère ' déplace le curseur d'impression d'un caractère en arrière, ce qui vous permet d'écraser le caractère qui était imprimé à cet endroit (il ne supprime pas la ligne entière ni même le caractère qui était là, à moins que vous n'imprimiez de nouvelles informations par-dessus). L'exemple suivant est un exemple de barre de progression utilisant Java ; bien qu'il ne suive pas votre format, il montre comment résoudre le problème principal de l'écrasement des caractères (ceci n'a été testé que dans Ubuntu 12.04 avec Oracle's Java 7 sur une machine 32-bit, mais il devrait fonctionner sur tous les systèmes Java) :

public class BackSpaceCharacterTest
{
    // the exception comes from the use of accessing the main thread
    public static void main(String[] args) throws InterruptedException
    {
        /*
            Notice the user of print as opposed to println:
            the '\b' char cannot go over the new line char.
        */
        System.out.print("Start[          ]");
        System.out.flush(); // the flush method prints it to the screen

        // 11 '\b' chars: 1 for the ']', the rest are for the spaces
        System.out.print("\b\b\b\b\b\b\b\b\b\b\b");
        System.out.flush();
        Thread.sleep(500); // just to make it easy to see the changes

        for(int i = 0; i < 10; i++)
        {
            System.out.print("."); //overwrites a space
            System.out.flush();
            Thread.sleep(100);
        }

        System.out.print("] Done\n"); //overwrites the ']' + adds chars
        System.out.flush();
    }
}

3voto

Derek Schultz Points 28

Vous pourriez imprimer le caractère de retour en arrière ' \b ' autant de fois que nécessaire pour supprimer la ligne avant d'imprimer la barre de progression mise à jour.

2 votes

Elle ne supprime pas la ligne précédente, mais déplace simplement le curseur d'un caractère en arrière.

2voto

Amiothenes Points 1

On pourrait simplement utiliser \r pour garder tout sur la même ligne tout en effaçant ce qui était précédemment sur cette ligne.

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