Java: wyczyść konsolę

140

Czy ktoś może mi powiedzieć, jaki kod jest używany do czyszczenia ekranu w Javie? Na przykład w C ++

system("CLS");

Jaki kod jest używany w Javie, aby uzyskać przejrzysty ekran?

Dzięki!

sadia
źródło

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.

Holger
źródło
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

satynowy
źródło
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.

Dyndrilliac
źródło
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();
czarny Lotos
źródło
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.

przycinać
źródło
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.

Abhishek Kashyap
źródło
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

user3648739
źródło
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

Bhuvanesh Waran
źródło
2

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

System.out.print('\u000C');
Abhigyan Singh
źródło
1

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

Epicki
źródło
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

Grégori Fernandes de Lima
źródło
-2

Musisz użyć JNI.

Przede wszystkim utwórz plik .dll za pomocą programu Visual Studio, który wywołuje system („cls”). Następnie użyj JNI, aby użyć tego DDL.

Znalazłem ten artykuł, który jest fajny:

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

Denny
źródło
To dla mnie praca. Mam prawdziwy projekt wykorzystujący JNI do czyszczenia ekranu w JAVA.
Denny
Na Węgrzech mówimy: „Uderza w muchę maczugą”.
Ambrus Tóth