HOWTO · Java

Cancella la console in Java

Mostra i due metodi per pulire lo schermo di una console in Java

In questa pagina

Java non include un metodo integrato per cancellare la console. Durante l’esecuzione di un programma puoi stampare sequenze di escape ANSI oppure avviare un comando fornito dal sistema operativo. Il metodo più adatto dipende dal terminale o dall’IDE che visualizza il programma. Entrambi chiedono al display di cancellare l’area visibile; nessuno dei due può garantire la rimozione dell’output precedente dalla cronologia di scorrimento del terminale o dalla cronologia delle esecuzioni salvata dall’IDE.
La gestione della console è una delle utilità quotidiane raccolte nel Tutorial Java.

Usa le sequenze di escape ANSI per cancellare la console

Le sequenze ANSI sono caratteri di controllo interpretati dal terminale. La sequenza \033[H sposta il cursore nella posizione iniziale, mentre \033[2J cancella lo schermo visibile. Stampa entrambe prima del prompt o del messaggio di stato successivo. \033[2J cancella l’intero display; il comportamento di cancellazione relativo al cursore è ottenuto con altri parametri di cancellazione del display, come \033[0J, che cancella dalla posizione del cursore fino alla fine del display.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

public class ClearConsole {
    public static void main(String[] args) {
        System.out.print("\033[H\033[2J");
        System.out.flush();
        System.out.println("Console cleared!");
    }
}
Console cleared!

Le sequenze di escape Java \033 inseriscono il carattere ESC. System.out.flush() invia subito la sequenza; senza questa chiamata, l’output nel buffer potrebbe non raggiungere il terminale prima dell’output successivo. Questo codice invia la richiesta, ma non può fare in modo che un terminale non compatibile la interpreti. Il supporto ANSI è comune negli emulatori di terminale, ma può dipendere dalle impostazioni del terminale, dalla configurazione dell’IDE e dal modo in cui viene avviato il programma. La cancellazione dello schermo visibile può lasciare intatta la cronologia di scorrimento del terminale. Se i caratteri di escape compaiono letteralmente o lo schermo non cambia, usa il comando dell’IDE per cancellare la console oppure controlla l’impostazione relativa al supporto ANSI.

Avvia un comando del sistema operativo con ProcessBuilder

Se il terminale mette a disposizione un comando per cancellare lo schermo, Java può avviarlo con ProcessBuilder. Il Prompt dei comandi di Windows usa cls tramite cmd /c; macOS e altri sistemi Unix-like offrono comunemente clear. L’esempio converte in minuscolo il nome del sistema operativo con Locale.ROOT e controlla il prefisso windows, quindi macOS (Darwin) segue il ramo Unix-like. Scegli il comando in base al sistema operativo effettivo, senza presumere che tutti i sistemi non Windows usino lo stesso comando. L’esempio verifica prima la presenza di una console interattiva, perché un comando che cancella un terminale non può cancellare un file o un pannello dell’IDE non collegato a un terminale:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

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 avvia un processo separato; non rende disponibile un comando che manca o che si trova fuori dal percorso di ricerca del processo. inheritIO() collega il processo figlio agli stessi flussi standard di input, output ed errore del processo Java, così un comando del terminale può agire sul display a cui è collegato. L’esempio attende il completamento e segnala un codice di uscita diverso da zero. Inoltre ripristina lo stato di interruzione se l’attesa viene interrotta. Il comando può comunque non riuscire se non è disponibile, se nell’ambiente mancano le informazioni sul terminale o se il processo viene avviato senza un terminale interattivo utilizzabile. Il controllo del sistema operativo seleziona soltanto un comando probabile: non verifica che il comando esista né che il terminale lo esegua.

Verifica il supporto del terminale e del sistema operativo

Usa il metodo ANSI quando sai che il terminale interpreta le sequenze di controllo ANSI. Evita dipendenze esterne ed è adatto quando l’ambiente dell’applicazione determina il comportamento del terminale. Usa il metodo basato su un processo solo se il comando scelto esiste e può accedere allo stesso terminale interattivo; i pannelli di esecuzione degli IDE, l’output reindirizzato e i processi in background possono comportarsi diversamente da un terminale. System.console() può restituire null negli IDE e quando input o output sono reindirizzati, anche se l’IDE mostra un pannello simile a una console. Nessuno dei due metodi rimuove in modo affidabile la cronologia di scorrimento o cancella la vista console di ogni IDE. Se il display non cambia, controlla l’impostazione ANSI del terminale e verifica che il programma sia collegato a un terminale interattivo; se vuoi cancellare la vista dell’IDE, preferisci il comando integrato dell’IDE per cancellare la console.