HOWTO · Java

So löschen Sie die Konsole in Java

Es zeigt die zwei Methoden zur Bereinigung eines Konsolenbildschirms in Java

Auf dieser Seite

Java hat keine integrierte Methode, die eine Konsole leert. Während ein Programm läuft, kannst du ANSI-Escape-Sequenzen ausgeben oder einen vom Betriebssystem bereitgestellten Befehl starten. Welche Methode funktioniert, hängt vom Terminal oder der IDE ab, in dem beziehungsweise der das Programm angezeigt wird. Beide Methoden fordern die Anzeige auf, ihren sichtbaren Bereich zu leeren; keine von ihnen garantiert, dass ältere Ausgaben aus dem Scrollback oder dem gespeicherten Ausführungsverlauf einer IDE entfernt werden.
Der Umgang mit der Konsole ist eines der Alltags-Hilfsprogramme, die das Java-Tutorial sammelt.

ANSI-Escape-Sequenzen zum Leeren der Konsole verwenden

ANSI-Sequenzen sind Steuerzeichen, die ein Terminal interpretiert. Die Sequenz \033[H bewegt den Cursor an die Ausgangsposition; \033[2J löscht den sichtbaren Bildschirm. Gib beide Sequenzen vor der nächsten Eingabeaufforderung oder Statusmeldung aus. \033[2J löscht die gesamte Anzeige. Das Löschen relativ zur Cursorposition wird durch andere Parameter zum Löschen der Anzeige gesteuert, etwa durch \033[0J, das vom Cursor bis zum Ende der Anzeige löscht.

Führe dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

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!

Die Java-String-Escapes \033 fügen das ESC-Zeichen ein. System.out.flush() gibt die Sequenz sofort weiter; ohne diesen Aufruf erreicht gepufferte Ausgabe das Terminal möglicherweise erst nach späteren Ausgaben. Dieser Code sendet die Aufforderung, kann aber ein nicht unterstütztes Terminal nicht dazu bringen, sie zu interpretieren. ANSI-Unterstützung ist in Terminal-Emulatoren verbreitet, kann jedoch von den Terminaleinstellungen, der IDE-Konfiguration und der Art abhängen, wie das Programm gestartet wird. Beim Leeren des sichtbaren Bildschirms kann außerdem der Scrollback-Verlauf des Terminals erhalten bleiben. Wenn die Escape-Zeichen wörtlich angezeigt werden oder sich der Bildschirm nicht ändert, verwende den Befehl der IDE zum Leeren der Konsole oder prüfe deren ANSI-Unterstützung.

Mit ProcessBuilder einen Betriebssystembefehl ausführen

Wenn das Terminal einen Befehl zum Leeren des Bildschirms bereitstellt, kann Java ihn mit ProcessBuilder starten. In der Windows-Eingabeaufforderung wird cls über cmd /c ausgeführt; macOS und andere Unix-ähnliche Systeme bieten üblicherweise clear. Das Beispiel wandelt den Betriebssystemnamen mit Locale.ROOT in Kleinbuchstaben um und prüft, ob er mit windows beginnt. Daher wird macOS (Darwin) dem Unix-ähnlichen Zweig zugeordnet. Wähle den Befehl passend zum tatsächlichen Betriebssystem aus, statt anzunehmen, dass auf jedem Nicht-Windows-System derselbe Befehl verfügbar ist. Dieses Beispiel prüft zunächst, ob eine interaktive Konsole vorhanden ist, denn ein Befehl zum Leeren eines Terminals kann weder eine Datei noch einen IDE-Bereich leeren, der nicht mit einem Terminal verbunden ist:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

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 startet einen separaten Prozess; er macht einen Befehl nicht verfügbar, wenn dieser fehlt oder sich nicht im Suchpfad des Prozesses befindet. inheritIO() verbindet den Unterprozess mit denselben Standardeingabe-, Standardausgabe- und Standardfehlerströmen wie den Java-Prozess. So kann ein Terminalbefehl auf die angeschlossene Anzeige wirken. Das Beispiel wartet, bis der Prozess beendet ist, und meldet einen Exit-Code ungleich null. Wird das Warten unterbrochen, stellt es außerdem den Unterbrechungsstatus wieder her. Ein Befehl kann weiterhin fehlschlagen, wenn er fehlt, der Umgebung Terminalinformationen fehlen oder der Prozess ohne ein nutzbares interaktives Terminal gestartet wird. Die Betriebssystemprüfung wählt lediglich einen wahrscheinlichen Befehl aus; sie bestätigt weder, dass der Befehl vorhanden ist, noch dass das Terminal ihn ausführt.

Unterstützung durch Terminal und Betriebssystem prüfen

Verwende die ANSI-Methode, wenn bekannt ist, dass das Terminal ANSI-Steuersequenzen interpretiert. Sie benötigt keine externe Abhängigkeit und eignet sich, wenn die Umgebung deiner Anwendung das Verhalten des Terminals bestimmt. Verwende die Prozessmethode nur, wenn der ausgewählte Befehl vorhanden ist und auf dasselbe interaktive Terminal zugreifen kann. IDE-Ausgabefenster, umgeleitete Ausgaben und Hintergrundjobs verhalten sich möglicherweise nicht wie ein Terminal. System.console() kann in IDEs sowie bei umgeleiteter Ein- oder Ausgabe null sein, selbst wenn die IDE einen konsolenähnlichen Bereich anzeigt. Keine der beiden Methoden entfernt zuverlässig den Scrollback-Verlauf oder leert die Konsolenansicht jeder IDE. Wenn sich die Anzeige nicht ändert, prüfe die ANSI-Einstellung des Terminals und ob das Programm mit einem interaktiven Terminal verbunden ist. Wenn du die Ansicht leeren möchtest, verwende anschließend am besten den dafür vorgesehenen Befehl der IDE.