HOWTO · Java
Comment vider la console en Java
Il montre les deux méthodes pour nettoyer un écran de console en Java
Sur cette page
Java ne possède aucune méthode intégrée pour effacer une console. Pendant l’exécution d’un programme, vous pouvez afficher des séquences d’échappement ANSI ou lancer une commande fournie par le système d’exploitation. La méthode qui fonctionne dépend du terminal ou de l’IDE qui affiche le programme. Les deux méthodes demandent à l’écran d’effacer sa zone visible ; aucune ne garantit la suppression des anciennes sorties de l’historique de défilement ou de l’historique des exécutions enregistré par un IDE.
La gestion de la console fait partie des utilitaires quotidiens rassemblés dans le Tutoriel Java.
Effacer la console avec des séquences d’échappement ANSI
Les séquences ANSI sont des caractères de contrôle interprétés par un terminal. La séquence \033[H place le curseur en haut à gauche, et \033[2J efface l’écran visible. Affichez les deux avant le prochain message d’invite ou d’état. \033[2J efface tout l’écran ; l’effacement à partir de la position du curseur est obtenu avec d’autres paramètres d’effacement de l’écran, comme \033[0J, qui efface la zone comprise entre le curseur et la fin de l’écran.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
public class ClearConsole {
public static void main(String[] args) {
System.out.print("\033[H\033[2J");
System.out.flush();
System.out.println("Console cleared!");
}
}
[H[2JConsole cleared!
Les séquences d’échappement \033 dans la chaîne Java insèrent le caractère ESC. System.out.flush() envoie rapidement la séquence ; sans cet appel, la sortie mise en mémoire tampon risque de ne pas parvenir au terminal avant les sorties suivantes. Ce code envoie la demande, mais ne peut pas obliger un terminal qui ne la prend pas en charge à l’interpréter. La prise en charge d’ANSI est courante dans les émulateurs de terminal, mais peut dépendre des paramètres du terminal, de la configuration de l’IDE et du mode de lancement du programme. L’effacement de l’écran visible peut aussi laisser intact l’historique de défilement du terminal. Si les caractères d’échappement s’affichent littéralement ou si l’écran ne change pas, utilisez la commande d’effacement de la console de l’IDE ou vérifiez son paramètre de prise en charge d’ANSI.
Lancer une commande du système d’exploitation avec ProcessBuilder
Si le terminal fournit une commande d’effacement de l’écran, Java peut la lancer avec ProcessBuilder. L’invite de commandes Windows utilise cls via cmd /c ; macOS et les autres systèmes de type Unix fournissent généralement clear. L’exemple met le nom du système d’exploitation en minuscules avec Locale.ROOT et vérifie s’il commence par windows ; macOS (Darwin) suit donc la branche des systèmes de type Unix. Choisissez la commande adaptée au système d’exploitation utilisé au lieu de supposer que tous les systèmes autres que Windows utilisent la même commande. Cet exemple vérifie d’abord qu’une console interactive est disponible, car une commande qui efface un terminal ne peut pas effacer un fichier ni un panneau d’IDE qui n’y est pas rattaché :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import java.io.IOException;
import java.util.Locale;
public class ClearConsoleWithCommand {
public static void main(String[] args) {
if (System.console() == null) {
System.out.println("No interactive console is attached.");
return;
}
try {
String os = System.getProperty("os.name").toLowerCase(Locale.ROOT);
ProcessBuilder builder = os.startsWith("windows")
? new ProcessBuilder("cmd", "/c", "cls")
: new ProcessBuilder("clear");
builder.inheritIO();
Process process = builder.start();
int exitCode = process.waitFor();
if (exitCode != 0) {
System.out.println("The clear command returned " + exitCode + ".");
}
} catch (IOException e) {
System.out.println("The clear command could not be started.");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Waiting for the clear command was interrupted.");
}
}
}
ProcessBuilder lance un processus distinct ; il ne rend pas disponible une commande absente ou située hors du chemin de recherche du processus. inheritIO() relie le processus enfant aux mêmes flux d’entrée, de sortie et d’erreur standard que le processus Java, ce qui permet à une commande de terminal d’agir sur l’écran auquel elle est rattachée. L’exemple attend la fin de l’exécution et signale tout code de sortie différent de zéro. Il rétablit également le statut d’interruption si l’attente est interrompue. Une commande peut tout de même échouer si elle est absente, si l’environnement ne fournit pas les informations nécessaires sur le terminal ou si le processus est lancé sans terminal interactif utilisable. La vérification du système d’exploitation sélectionne seulement une commande probable ; elle ne garantit ni que cette commande existe ni que le terminal l’exécutera comme prévu.
Vérifier la prise en charge du terminal et du système d’exploitation
Utilisez la méthode ANSI lorsque vous savez que le terminal interprète les séquences de contrôle ANSI. Elle ne dépend d’aucun programme externe et convient lorsque votre environnement d’application détermine le comportement du terminal. Utilisez la méthode avec un processus uniquement si la commande choisie existe et peut accéder au même terminal interactif ; les panneaux d’exécution des IDE, les sorties redirigées et les tâches en arrière-plan peuvent ne pas se comporter comme un terminal. System.console() peut renvoyer null dans un IDE et lorsque l’entrée ou la sortie est redirigée, même si l’IDE affiche un panneau ressemblant à une console. Aucune des deux méthodes ne supprime de façon fiable l’historique de défilement ni n’efface la vue console de tous les IDE. Si l’écran ne change pas, vérifiez le paramètre ANSI du terminal et si le programme est rattaché à un terminal interactif, puis privilégiez la commande d’effacement propre à l’IDE si vous devez vider sa vue.