Java: Löschen Sie die Konsole


Antworten:


111

Da es hier mehrere Antworten gibt, die nicht funktionierenden Code für Windows anzeigen, ist hier eine Klarstellung:

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

Dieser Befehl ist nicht funktioniert, aus zwei Gründen:

  1. Es gibt keine ausführbare Datei mit dem Namen cls.exeoder cls.comin einer Standard-Windows-Installation, über die aufgerufen werden könnte Runtime.exec, da der bekannte Befehl clsin den Windows-Befehlszeileninterpreter integriert ist.

  2. Beim Starten eines neuen Prozesses über Runtime.execwird die Standardausgabe an eine Pipe umgeleitet, die der initiierende Java-Prozess lesen kann. Wenn die Ausgabe des clsBefehls jedoch umgeleitet wird, wird die Konsole nicht gelöscht.

Um dieses Problem zu lösen, müssen wir den Befehlszeileninterpreter ( cmd) aufrufen und ihn /c clsanweisen , einen Befehl ( ) auszuführen , mit dem eingebaute Befehle aufgerufen werden können. Des Weiteren haben wir seine Ausgangskanal direkt an den Java - Prozess Ausgangskanal zu verbinden, was 7 mit Java arbeitet beginnend mit 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();
    }
}

Wenn der Java-Prozess nun mit einer Konsole verbunden ist, dh über eine Befehlszeile ohne Umleitung der Ausgabe gestartet wurde, wird die Konsole gelöscht.


1
Warum funktioniert das bei mir nicht? Ich
führe

87

Sie können den folgenden Code verwenden, um die Befehlszeilenkonsole zu löschen:

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

Weitere Referenzen finden Sie unter: http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html


2
Möchtest du das überhaupt ergänzen? Was ist diese Zeichenfolge und müssen Sie leeren, wenn die automatische Spülung aktiviert ist?
cossacksman

7
Sie sind ANSI-Escape-Codes . Besonders klarer Bildschirm, gefolgt von zu Hause . Aber warum ist "Zuhause" notwendig?
Jdurston

2
Wenn Sie @jdurston weglassen, wird der Cursor nicht zurück zum oberen Rand des Fensters zurückgesetzt.
Hugo Zink

1
Funktioniert nicht in Eclipse, aber im Linux-Terminal. Eine Stimme für Sie
Anh Tuan

7
Dies funktioniert nur, wenn der Terminalemulator, in dem Java ausgeführt wird, ANSI-Escape-Codes unterstützt. Windows NT / XP / 7/8/10 CMD nicht
Thorbjørn Ravn Andersen

19

So würde ich damit umgehen. Diese Methode funktioniert für den Windows-Fall und den Linux / Unix-Fall (was bedeutet, dass sie auch für Mac OS X funktioniert).

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.
    }
}

Beachten Sie, dass diese Methode die Konsole im Allgemeinen nicht löscht, wenn Sie in einer IDE ausgeführt werden.


10
Unter Windows 8.1:java.io.IOException: Cannot run program "cls": CreateProcess error=2, The system cannot find the file specified
Ben Leggiero

1
@BenLeggiero Dieser Fehler tritt auf, wenn der Befehl cls aus irgendeinem Grund von der JVM in einem Verzeichnis der Umgebungsvariablen PATH nicht gefunden wird. Dieser Code ruft lediglich den Windows- oder Unix-Systembefehl basierend auf der Standardsystemkonfiguration auf, um die Eingabeaufforderung bzw. das Terminalfenster zu löschen. Es sollte genau so sein, als würde man ein Terminalfenster öffnen und "cls" gefolgt von der Eingabetaste eingeben.
Dyndrilliac

22
clsIn Windows ist keine ausführbare Datei vorhanden. Es ist ein interner Befehl von cmd.exe.
a_horse_with_no_name

7
Wie von anderen gesagt, funktioniert das überhaupt nicht , nicht nur, weil Windows keine ausführbare CLS-Datei hat, sondern auch, weil die Ausgabe von Unterprozessen umgeleitet wird.
Holger

2
Diese Antwort ist auch ein Thema auf Meta siehe: meta.stackoverflow.com/questions/308950/…
Petter Friberg

15

Eine Möglichkeit, dies zu erreichen, besteht darin, mehrere Zeilenende ("\ n") zu drucken und den übersichtlichen Bildschirm zu simulieren. Am Ende klar, höchstens in der Unix-Shell, entfernt nicht den vorherigen Inhalt, verschiebt ihn nur nach oben und wenn Sie nach unten scrollen, können Sie den vorherigen Inhalt sehen.

Hier ist ein Beispielcode:

for (int i = 0; i < 50; ++i) System.out.println();

13
Ein schnellerer Weg, dies zu erreichen, besteht darin, eine einzelne Zeichenfolge von 50 \r\nmit einer einzelnen zu drucken println, da zwischen den printlnAnrufen eine merkliche Verzögerung auftritt.
Ben Leggiero

7
Woher wissen Sie, wie viele Zeilen die Konsole für die Anzeige konfiguriert ist? Könnte in den meisten Fällen funktionieren, aber nicht in allen.
Cypher

4
Der größte Unterschied zwischen diesem und einem richtigen clearbesteht darin, dass bei letzterem die neue Ausgabe oben auf dem Bildschirm und nicht unten angezeigt wird.
ndm13

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));wird die Arbeit schneller und besser erledigen.
Aaron Esau

1
@AaronEsau ab JDK 11 können Sie verwendenSystem.out.println(System.lineSeparator().repeat(50));
Holger

15

Wenn Sie dies systemunabhängiger wünschen , können Sie die JLine- Bibliothek und ConsoleReader.clearScreen () verwenden . Es lohnt sich wahrscheinlich auch, sorgfältig zu prüfen, ob JLine und ANSI in der aktuellen Umgebung unterstützt werden .

So etwas wie der folgende Code hat bei mir funktioniert:

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 + "'.");

        }
    }
}

Wenn Sie dies ausführen und an der Eingabeaufforderung "Löschen" eingeben, wird der Bildschirm gelöscht. Stellen Sie sicher, dass Sie es von einem geeigneten Terminal / einer Konsole aus ausführen und nicht in Eclipse.


14

Erstellen Sie eine Methode in Ihrer Klasse wie folgt : [wie @Holger hier sagte .]

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) {}
}

Dies funktioniert zumindest für Windows, ich habe bisher noch nicht nach Linux gesucht. Wenn jemand es auf Linux überprüft, lassen Sie mich bitte wissen, ob es funktioniert (oder nicht).

Als alternative Methode schreiben Sie diesen Code in 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

Ich werde Ihnen nicht empfehlen, diese Methode zu verwenden.


1
funktioniert gut für Windows 10!
Gaurav

7

Runtime.getRuntime (). Exec (cls) funktionierte NICHT auf meinem XP-Laptop. Dies tat -

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

Hoffe das ist nützlich


Wenn Sie die Position des
Pufferindex

1
Wenn der Prozess unterbrochen werden sollte, würde es wahrscheinlich zu Verzögerungen kommen, wenn einige Ausdrucke vor anderen entfernt werden.
TrevorLee

7

Versuche Folgendes :

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

Dies funktioniert gut in Linux-Umgebung


2

Dies funktioniert, wenn Sie dies in Bluej oder einer anderen ähnlichen Software tun.

System.out.print('\u000C');

1

Sie können eine Emulation von clswith verwenden for (int i = 0; i < 50; ++i) System.out.println();


2
Es ist nur ein Hinweis, vielleicht möchte jemand den Bildschirm löschen, Eigentlich
Sarz

@Sarz: und tatsächlich macht "Löschen des Bildschirms" für sich genommen auch keinen Sinn
Gyom

0

Sie müssen Steuerzeichen als Backslash (\ b) und Wagenrücklauf (\ r) verwenden. Es ist standardmäßig deaktiviert, aber die Konsolenansicht kann diese Steuerelemente interpretieren.

Windows> Einstellungen und Ausführen / Debuggen> Konsole und wählen Sie ASCII-Steuerzeichen interpretieren, um sie zu aktivieren

Konsoleneinstellungen in Eclipse

Nach diesen Konfigurationen können Sie Ihre Konsole mit folgenden Steuerzeichen verwalten:

\ t - Registerkarte.

\ b - Rücktaste (ein Schritt zurück im Text oder das Löschen eines einzelnen Zeichens).

\ n - neue Zeile.

\ r - Wagenrücklauf. ()

\ f - Formularvorschub.

Animation der Eclipse-Konsole löschen

Weitere Informationen unter: https://www.eclipse.org/eclipse/news/4.14/platform.php


-2

Sie müssen JNI verwenden.

Erstellen Sie zunächst mit Visual Studio eine DLL, die das System ("cls") aufruft. Verwenden Sie danach JNI, um diese DDL zu verwenden.

Ich fand diesen Artikel, der schön ist:

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


Das ist Arbeit für mich. Ich habe ein echtes Projekt mit JNI, um den Bildschirm in JAVA zu löschen.
Denny

In Ungarn sagen wir: "Er schlägt die Fliege mit einem Streitkolben."
Ambrus Tóth
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.