Java: effacez la console

Réponses:

111

Puisqu'il y a plusieurs réponses ici montrant du code non fonctionnel pour Windows, voici une clarification:

Runtime.getRuntime().exec("cls");

Cette commande ne fonctionne pas , pour deux raisons:

  1. Il n'y a pas d'exécutable nommé cls.exeou cls.comdans une installation Windows standard qui pourrait être Runtime.execappelé via , car la commande bien connue clsest intégrée à l'interpréteur de ligne de commande de Windows.

  2. Lors du lancement d'un nouveau processus via Runtime.exec, la sortie standard est redirigée vers un tube que le processus Java initiateur peut lire. Mais lorsque la sortie de la clscommande est redirigée, elle ne vide pas la console.

Pour résoudre ce problème, nous devons appeler l'interpréteur de ligne de commande ( cmd) et lui dire d'exécuter une commande ( /c cls) qui permet d'appeler des commandes intégrées. De plus, nous devons connecter directement son canal de sortie au canal de sortie du processus Java, qui fonctionne à partir de Java 7, en utilisant inheritIO():

import java.io.IOException;

public class CLS {
    public static void main(String... arg) throws IOException, InterruptedException {
        new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
    }
}

Maintenant, lorsque le processus Java est connecté à une console, c'est-à-dire qu'il a été lancé à partir d'une ligne de commande sans redirection de sortie, il effacera la console.

Holger
la source
1
Pourquoi cela ne fonctionne pas pour moi?
J'exécute
87

Vous pouvez utiliser le code suivant pour effacer la console de ligne de commande:

public static void clearScreen() {  
    System.out.print("\033[H\033[2J");  
    System.out.flush();  
}  

Pour plus de références, visitez: http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html

rassasier
la source
2
Voulez-vous ajouter quelque chose? Quelle est cette chaîne et devez-vous vider si l'autoflush est activé?
Cossacksman
7
Ce sont des codes d'échappement ANSI . Écran spécifiquement clair, suivi de la maison . Mais pourquoi «chez soi» est-il nécessaire?
jdurston
2
@jdurston omettre home ne réinitialisera pas le curseur en haut de la fenêtre.
Hugo Zink
1
Ne fonctionne pas dans Eclipse, mais fonctionne dans le terminal Linux. Un vote pour vous
Anh Tuan
7
Cela ne fonctionne que si l'émulateur de terminal dans lequel Java s'exécute prend en charge les codes d'échappement ANSI. Windows NT / XP /
Thorbjørn Ravn Andersen
19

Voilà comment je le gérerais. Cette méthode fonctionnera pour le cas du système d'exploitation Windows et le cas du système d'exploitation Linux / Unix (ce qui signifie qu'elle fonctionne également pour Mac OS X).

public final static void clearConsole()
{
    try
    {
        final String os = System.getProperty("os.name");

        if (os.contains("Windows"))
        {
            Runtime.getRuntime().exec("cls");
        }
        else
        {
            Runtime.getRuntime().exec("clear");
        }
    }
    catch (final Exception e)
    {
        //  Handle any exceptions.
    }
}

Notez que cette méthode n'effacera généralement pas la console si vous exécutez dans un IDE.

Dyndrilliac
la source
10
Sous Windows 8.1:java.io.IOException: Cannot run program "cls": CreateProcess error=2, The system cannot find the file specified
Ben Leggiero
1
@BenLeggiero Cette erreur se produit si, pour une raison quelconque, la commande cls n'est pas trouvée par la JVM dans un répertoire de la variable d'environnement PATH. Tout ce que ce code fait est d'appeler la commande système Windows ou Unix basée sur la configuration système par défaut pour effacer respectivement l'invite de commande ou la fenêtre du terminal. Cela devrait être exactement la même chose que d'ouvrir une fenêtre de terminal et de taper «cls» suivi de la touche Entrée.
Dyndrilliac
22
Il n'y a pas d' clsexécutable sous Windows. C'est une commande interne de cmd.exe.
a_horse_with_no_name
7
Comme d'autres l'ont dit, ne fonctionne pas du tout , non seulement parce que Windows n'a pas d'exécutable cls, mais aussi parce que la sortie des sous-processus est redirigée.
Holger
2
Cette réponse est également un sujet sur la méta voir: meta.stackoverflow.com/questions/308950/…
Petter Friberg
15

Un moyen d'obtenir cela peut être d'imprimer plusieurs extrémités de lignes ("\ n") et de simuler l'écran clair. À la fin, effacez, au plus dans le shell unix, ne supprime pas le contenu précédent, ne le déplace que vers le haut et si vous faites défiler vers le bas, vous pouvez voir le contenu précédent.

Voici un exemple de code:

for (int i = 0; i < 50; ++i) System.out.println();
Lotus Noir
la source
13
Un moyen plus rapide d'accomplir cela consiste à imprimer une seule chaîne de 50 \r\navec une seule println, car il y a un délai notable entre les printlnappels.
Ben Leggiero
7
Comment savoir combien de lignes la console est configurée pour afficher? Peut fonctionner dans la plupart des cas, mais pas dans tous.
Chiffre
4
La plus grande différence entre ceci et un propre clearest que dans ce dernier, la nouvelle sortie sera en haut de l'écran et non en bas.
ndm13
5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));fera le travail plus vite et mieux.
Aaron Esau
1
@AaronEsau à partir de JDK 11, vous pouvez utiliserSystem.out.println(System.lineSeparator().repeat(50));
Holger
15

Si vous voulez une manière indépendante plus de système de le faire, vous pouvez utiliser la JLine bibliothèque et ConsoleReader.clearScreen () . Il vaut probablement la peine de vérifier prudemment si JLine et ANSI sont pris en charge dans l'environnement actuel.

Quelque chose comme le code suivant a fonctionné pour moi:

import jline.console.ConsoleReader;

public class JLineTest
{
    public static void main(String... args)
    throws Exception
    {
        ConsoleReader r = new ConsoleReader();

        while (true)
        {
            r.println("Good morning");
            r.flush();

            String input = r.readLine("prompt>");

            if ("clear".equals(input))
                r.clearScreen();
            else if ("exit".equals(input))
                return;
            else
                System.out.println("You typed '" + input + "'.");

        }
    }
}

Lorsque vous exécutez cela, si vous tapez «effacer» à l'invite, cela effacera l'écran. Assurez-vous de l'exécuter à partir d'un terminal / console approprié et non dans Eclipse.

élagage
la source
14

Créez une méthode dans votre classe comme ceci: [comme @Holger l'a dit ici .]

public static void clrscr(){
    //Clears Screen in java
    try {
        if (System.getProperty("os.name").contains("Windows"))
            new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
        else
            Runtime.getRuntime().exec("clear");
    } catch (IOException | InterruptedException ex) {}
}

Cela fonctionne au moins pour Windows, je n'ai pas encore vérifié Linux. Si quelqu'un le vérifie pour Linux, merci de me faire savoir s'il fonctionne (ou non).

Une autre méthode consiste à écrire ce code dans clrscr():

for(int i = 0; i < 80*300; i++) // Default Height of cmd is 300 and Default width is 80
    System.out.print("\b"); // Prints a backspace

Je ne vous recommanderai pas d'utiliser cette méthode.

Abhishek Kashyap
la source
1
fonctionne bien pour Windows 10!
gaurav
7

Runtime.getRuntime (). Exec (cls) ne fonctionnait PAS sur mon ordinateur portable XP. Cela a fait -

for(int clear = 0; clear < 1000; clear++)
  {
     System.out.println("\b") ;
  }

J'espère que c'est utile

user3648739
la source
si vous pouviez définir l'emplacement de l'index de la mémoire tampon pour commencer, ce serait la seule approche la plus simple
DevilInDisguise
1
Si le processus devait être interrompu, j'imagine que vous verriez un décalage avec certains print.out supprimés avant d'autres.
TrevorLee
7

Essayez ce qui suit:

System.out.print("\033\143");

Cela fonctionnera bien dans l'environnement Linux

Bhuvanesh Waran
la source
2

Cela fonctionnera si vous faites cela dans Bluej ou tout autre logiciel similaire.

System.out.print('\u000C');
Abhigyan Singh
la source
1

Vous pouvez utiliser une émulation de clsavec for (int i = 0; i < 50; ++i) System.out.println();

Épique
la source
2
C'est juste un indice, peut-être que quelqu'un veut effacer l'écran, en fait
Sarz
@Sarz: et en fait, "effacer l'écran" n'a pas de sens en soi non plus
Gyom
0

Vous devez utiliser des caractères de contrôle comme barre oblique inverse (\ b) et retour chariot (\ r). Il est désactivé par défaut, mais la vue Console peut interpréter ces commandes.

Windows> Préférences et Run / Debug> Console et sélectionnez Interprétez caracteres de contrôle ASCII à lui ont permis

Préférences de la console dans Eclipse

Après ces configurations, vous pouvez gérer votre console avec des caractères de contrôle comme:

\ t - tab.

\ b - retour arrière (un retour en arrière dans le texte ou la suppression d'un seul caractère).

\ n - nouvelle ligne.

\ r - retour chariot. ()

\ f - alimentation de formulaire.

animation claire de la console éclipse

Plus d'informations sur: https://www.eclipse.org/eclipse/news/4.14/platform.php

Grégori Fernandes de Lima
la source
-2

Vous devez utiliser JNI.

Tout d'abord, créez un fichier .dll à l'aide de Visual Studio, qui appelle system ("cls"). Après cela, utilisez JNI pour utiliser ce DDL.

J'ai trouvé cet article sympa:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=5170&lngWId=2

Denny
la source
C'est du travail pour moi. J'ai un vrai projet utilisant JNI pour effacer l'écran en JAVA.
Denny
En Hongrie, nous disons "Il frappe la mouche avec une masse".
Ambrus Tóth