Java: wyczyść konsolę


Odpowiedzi:


111

Ponieważ istnieje kilka odpowiedzi pokazujących niedziałający kod dla systemu Windows, oto wyjaśnienie:

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

To polecenie nie działa z dwóch powodów:

  1. Nie ma pliku wykonywalnego o nazwie cls.exeani cls.comw standardowej instalacji systemu Windows, który mógłby zostać wywołany za pośrednictwem Runtime.exec, ponieważ dobrze znane polecenie clsjest wbudowane w interpreter wiersza poleceń systemu Windows.

  2. Podczas uruchamiania nowego procesu przez Runtime.execstandardowe wyjście jest przekierowywane do potoku, który może odczytać inicjujący proces Java. Ale kiedy dane wyjściowe clspolecenia zostaną przekierowane, nie czyści konsoli.

Aby rozwiązać ten problem, musimy wywołać interpreter wiersza poleceń ( cmd) i powiedzieć mu, aby wykonał polecenie ( /c cls), które umożliwia wywoływanie poleceń wbudowanych. Ponadto musimy bezpośrednio połączyć jego kanał wyjściowy z kanałem wyjściowym procesu Java, który działa począwszy od Java 7, używając 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();
    }
}

Teraz, gdy proces Java jest połączony z konsolą, tj. Został uruchomiony z wiersza poleceń bez przekierowania wyjścia, konsola zostanie wyczyszczona.


1
Dlaczego to nie działa dla mnie? Uruchamiam program na Windows CMD, ale ekran nie jest wyczyszczony
Alist3r

87

Możesz użyć następującego kodu, aby wyczyścić konsolę wiersza poleceń:

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

Więcej referencji można znaleźć na stronie: http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html


2
Chcesz coś do tego w ogóle dodać? Co to za ciąg i czy musisz go opróżnić, jeśli funkcja autoflush jest włączona?
kozak

7
Są to kody ucieczki ANSI . Szczególnie przejrzysty ekran, a następnie dom . Ale dlaczego „dom” jest potrzebny?
jdurston

2
@jdurston pomijanie home nie spowoduje zresetowania kursora z powrotem do górnej części okna.
Hugo Zink,

1
Nie działa w Eclipse, ale działa w terminalu Linux. Jeden głos dla Ciebie
Anh Tuan,

7
Działa to tylko wtedy, gdy emulator terminala, w którym działa Java, obsługuje kody ucieczki ANSI. Windows NT / XP / 7/8/10 CMD nie
Thorbjørn Ravn Andersen

19

Tak bym sobie z tym poradził. Ta metoda będzie działać w przypadku systemu operacyjnego Windows i systemu Linux / Unix OS (co oznacza, że ​​działa również w przypadku systemu 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.
    }
}

Zauważ, że ta metoda generalnie nie wyczyści konsoli, jeśli pracujesz w środowisku IDE.


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

1
@BenLeggiero Ten błąd występuje, jeśli z jakiegoś powodu komenda cls nie zostanie znaleziona przez maszynę JVM w jakimś katalogu ze zmiennej środowiskowej PATH. Wszystko, co robi ten kod, to wywołanie polecenia systemu Windows lub Unix w oparciu o domyślną konfigurację systemu, aby wyczyścić odpowiednio wiersz polecenia lub okno terminala. Powinno to być dokładnie to samo, co otwarcie okna terminala i wpisanie „cls”, a następnie klawisz Enter.
Dyndrilliac

22
W clssystemie Windows nie ma pliku wykonywalnego. Jest to polecenie wewnętrznecmd.exe .
a_horse_with_no_name

7
Jak powiedzieli inni, w ogóle nie działa , nie tylko dlatego, że Windows nie ma pliku wykonywalnego cls, ale także dlatego, że dane wyjściowe podprocesów są przekierowywane.
Holger

2
Ta odpowiedź jest również tematem na meta patrz: meta.stackoverflow.com/questions/308950/…
Petter Friberg

15

Sposobem na osiągnięcie tego może być wydrukowanie wielu końców linii („\ n”) i zasymulowanie przejrzystego ekranu. Na koniec wyczyść, co najwyżej w powłoce unixowej, nie usuwa poprzedniej zawartości, tylko przesuwa ją w górę i jeśli zrobisz przewiń w dół, możesz zobaczyć poprzednią zawartość.

Oto przykładowy kod:

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

13
Szybszym sposobem na osiągnięcie tego jest wydrukowanie pojedynczego ciągu 50 \r\nz pojedynczym println, ponieważ występuje zauważalne opóźnienie między printlnwywołaniami.
Ben Leggiero

7
Skąd wiesz, ile wierszy jest skonfigurowanych do wyświetlania konsoli? Może działać w większości przypadków, ale nie we wszystkich.
Cypher

4
Największą różnicą między tym a właściwym clearjest to, że w tym drugim nowe wyjście będzie na górze ekranu, a nie na dole.
ndm13

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));wykona pracę szybciej i lepiej.
Aaron Esau

1
@AaronEsau zaczynając od JDK 11, możesz użyćSystem.out.println(System.lineSeparator().repeat(50));
Holger

15

Jeśli chcesz zrobić to w sposób bardziej niezależny od systemu, możesz użyć biblioteki JLine i ConsoleReader.clearScreen () . Ostrożne sprawdzenie, czy JLine i ANSI są obsługiwane w obecnym środowisku, prawdopodobnie też warto zrobić.

Coś takiego jak poniższy kod zadziałało dla mnie:

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

        }
    }
}

Po uruchomieniu tego, jeśli wpiszesz „wyczyść” po monicie, ekran zostanie wyczyszczony. Upewnij się, że uruchamiasz go z odpowiedniego terminala / konsoli, a nie w Eclipse.


14

Utwórz metodę w swojej klasie w następujący sposób: [jak powiedział tutaj @Holger .]

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

Działa to przynajmniej w systemie Windows, do tej pory nie sprawdzałem systemu Linux. Jeśli ktoś sprawdzi, czy działa pod Linuksem, daj mi znać, czy działa (czy nie).

Alternatywną metodą jest napisanie tego kodu w 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

Nie polecam Ci tej metody.


1
działa dobrze w systemie Windows 10!
gaurav

7

Runtime.getRuntime (). Exec (cls) NIE działa na moim laptopie XP. To zrobiło -

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

Mam nadzieję, że to jest przydatne


gdybyś mógł ustawić lokalizację indeksu bufora, aby rozpocząć, byłoby to jedyne najłatwiejsze podejście
DevilInDisguise,

1
Jeśli proces miałby zostać przerwany, wyobrażam sobie, że zobaczyłbyś opóźnienie z usunięciem niektórych print.out przed innymi.
TrevorLee

7

Spróbuj wykonać następujące czynności:

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

To zadziała dobrze w środowisku Linux


2

To zadziała, jeśli robisz to w Bluej lub innym podobnym oprogramowaniu.

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

1

Możesz użyć emulacji clswith for (int i = 0; i < 50; ++i) System.out.println();


2
To tylko podpowiedź, może ktoś chce wyczyścić ekran, Właściwie
Sarz

@Sarz: i właściwie "czyszczenie ekranu" samo w sobie też nie ma sensu
Gyom,

0

Musisz użyć znaków sterujących jako ukośnika odwrotnego (\ b) i powrotu karetki (\ r). Jest domyślnie wyłączony, ale widok konsoli może interpretować te kontrolki.

Windows> Preferencje i Uruchom / Debuguj> Konsola i wybierz Interpretuj znaki kontrolne ASCII, aby ją włączyć

Preferencje konsoli w Eclipse

Po tych konfiguracjach możesz zarządzać konsolą za pomocą znaków sterujących, takich jak:

\ t - tab.

\ b - backspace (krok wstecz w tekście lub usunięcie pojedynczego znaku).

\ n - nowa linia.

\ r - powrót karetki. ()

\ f - kanał formularza.

Wyraźna animacja konsoli zaćmienia

Więcej informacji: https://www.eclipse.org/eclipse/news/4.14/platform.php


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.