Java: очистить консоль


Ответы:


111

Так как здесь есть несколько ответов, показывающих нерабочий код для Windows, вот пояснение:

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

Эта команда не работает по двум причинам:

  1. Не существует исполняемого файла с именем cls.exeили cls.comв стандартной установке Windows, который можно было бы вызвать с помощью Runtime.exec, поскольку известная команда clsвстроена в интерпретатор командной строки Windows.

  2. При запуске нового процесса через Runtime.execстандартный вывод перенаправляется в канал, который может прочитать инициирующий процесс Java. Но когда вывод clsкоманды перенаправляется, консоль не очищается.

Чтобы решить эту проблему, мы должны вызвать интерпретатор командной строки ( cmd) и сказать ему выполнить команду ( /c cls), которая позволяет вызывать встроенные команды. Далее мы должны напрямую подключить его выходной канал к выходному каналу процесса Java, который работает, начиная с Java 7, используя 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();
    }
}

Теперь, когда процесс Java подключен к консоли, то есть запущен из командной строки без перенаправления вывода, он очистит консоль.


1
Почему это не работает для меня? Я запускаю программу на Windows CMD, но экран не очищается
Alist3r

87

Вы можете использовать следующий код для очистки консоли командной строки:

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

Для дальнейших ссылок посетите: http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html


2
Хотите добавить к этому вообще? Что это за строка и нужно ли ее очищать, если включена автозаполнение?
казак

7
Это коды выхода ANSI . Специально понятный экран, затем домашний . Но зачем нужен «дом»?
Jdurston

2
@jdurston без указания home не вернет курсор в верхнюю часть окна.
Хьюго Цинк,

1
Не работает в Eclipse, но работает в терминале Linux. Один голос за вас
Ань Туан

7
Это работает, только если эмулятор терминала, в котором работает Java, поддерживает управляющие коды ANSI. Windows NT / XP /
Торбьерн Равн Андерсен

19

Вот как бы я справился с этим. Этот метод будет работать для случая ОС Windows и случая ОС Linux / Unix (что означает, что он также работает для 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.
    }
}

Обратите внимание, что этот метод обычно не очищает консоль, если вы работаете внутри IDE.


10
На Windows 8.1:java.io.IOException: Cannot run program "cls": CreateProcess error=2, The system cannot find the file specified
Бен Легжеро

1
@BenLeggiero Эта ошибка возникает, если по какой-то причине команда cls не найдена JVM в каком-либо каталоге из переменной среды PATH. Весь этот код вызывает системную команду Windows или Unix, основанную на конфигурации системы по умолчанию, чтобы очистить окно командной строки или терминала соответственно. Это должно быть точно так же, как открыть окно терминала и набрать «cls», а затем клавишу «Enter».
Диндрилла

22
В clsWindows нет исполняемого файла. Это внутренняя команда cmd.exe.
a_horse_with_no_name

7
Как говорят другие, он вообще не работает , не только потому, что в Windows нет исполняемого файла cls, но и потому, что вывод подпроцессов перенаправляется.
Хольгер

2
Этот ответ также является темой на мета- странице
Петтер Фриберг,

15

Для этого можно напечатать несколько концов строк ("\ n") и смоделировать очистку экрана. В конце ясно, что самое большее в оболочке Unix, не удаляет предыдущий контент, только перемещает его вверх и, если вы сделаете прокрутку вниз, можно увидеть предыдущий контент.

Вот пример кода:

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

13
Более быстрый способ сделать это - напечатать одну строку из 50 \r\nс одной println, поскольку между printlnвызовами заметна задержка .
Бен Легжеро

7
Как узнать, сколько строк настроено на консоль? Может работать в большинстве случаев, но не во всех.
Cypher

4
Самая большая разница между этим и собственно clearзаключается в том, что в последнем случае новый вывод будет вверху экрана, а не внизу.
ndm13

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));будет делать работу быстрее и лучше.
Аарон Исав

1
@AaronEsau, начиная с JDK 11, вы можете использоватьSystem.out.println(System.lineSeparator().repeat(50));
Хольгер

15

Если вы хотите более системный независимый способ сделать это, вы можете использовать JLine библиотеку и ConsoleReader.clearScreen () . Вероятно, стоит также провести осторожную проверку того, поддерживаются ли JLine и ANSI в текущей среде.

Что-то вроде следующего кода работает для меня:

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

        }
    }
}

При выполнении этого, если вы введете «очистить» в командной строке, он очистит экран. Убедитесь, что вы запускаете его с правильного терминала / консоли, а не в Eclipse.


14

Создайте метод в своем классе следующим образом: [как сказал здесь @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) {}
}

Это работает для Windows, по крайней мере, я не проверял для Linux до сих пор. Если кто-нибудь проверит его на Linux, пожалуйста, дайте мне знать, работает ли он (или нет).

Как альтернативный способ написать этот код в 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

Я не буду рекомендовать вам использовать этот метод.


1
хорошо работает для Windows 10!
Гаурав

7

Runtime.getRuntime (). Exec (cls) НЕ работал на моем ноутбуке с XP. Это сделал -

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

Надеюсь, это полезно


если бы вы могли установить местоположение индекса буфера для запуска, это был бы единственный самый простой подход
DevilInDisguise

1
Если бы процесс был прерван, я думаю, вы бы увидели задержку с удалением некоторых print.out перед другими.
TrevorLee


2

Это будет работать, если вы делаете это в Bluej или любом другом подобном программном обеспечении.

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

1

Вы можете использовать эмуляцию clsс for (int i = 0; i < 50; ++i) System.out.println();


2
Это всего лишь подсказка, может быть, кто-то хочет очистить экран, На самом деле
Sarz

@Sarz: и собственно «очистка экрана» сама по себе тоже не имеет смысла
Gyom

0

Вы должны использовать управляющие символы как обратную косую черту (\ b) и возврат каретки (\ r). По умолчанию он отключен, но представление консоли может интерпретировать эти элементы управления.

Windows> «Установки» и « Выполнить / Отладка»> «Консоль» и выберите « Интерпретировать символы управления ASCII», чтобы включить его

Настройки консоли в Eclipse

После этих настроек вы можете управлять своей консолью с помощью управляющих символов, таких как:

\ t - вкладка

\ b - backspace (шаг назад в тексте или удаление одного символа).

\ n - новая строка.

\ r - возврат каретки. ()

\ f - подача формы.

затмение консоли четкая анимация

Дополнительная информация по адресу: https://www.eclipse.org/eclipse/news/4.14/platform.php.


-2

Вам нужно использовать JNI.

Прежде всего используйте создать .dll с помощью visual studio, которая вызывает систему («cls»). После этого используйте JNI, чтобы использовать этот DDL.

Я нашел эту статью, которая хороша:

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


Это работа для меня. У меня есть реальный проект, использующий JNI для очистки экрана в JAVA.
Денни

В Венгрии мы говорим: «Он ударил муху булавой».
Амбрус Тот
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.