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


140

Чи може будь-який орган сказати мені, який код використовується для очищення екрана на Java? Наприклад в C ++

system("CLS");

Який код використовується на 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 опускання будинку не скине курсор назад у верхній частині вікна.
Хуго Цинк

1
Не працює в Eclipse, але працює в терміналі Linux. Один голос для вас
Анх Туан

7
Це працює лише в тому випадку, якщо емулятор терміналу, в якому працює Java, підтримує ANSI-коди виходу. CMD для Windows NT / XP / 7/8/10 не має
Thorbjørn Ravn Andersen

19

Ось як я впорався б із цим. Цей метод буде працювати для випадку Windows OS та випадку Linux / Unix OS (це означає, що він також працює для 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
Ця відповідь також є темою для мета дивіться: meta.stackoverflow.com/questions/308950/…
Петтер Фріберг,

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));
Holger

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

        }
    }
}

Запустивши це, якщо ви введете 'clear' у відповідь, це очистить екран. Переконайтеся, що ви запускаєте його з належного термінала / консолі, а не в 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!
gaurav

7

Runtime.getRuntime (). Exec (cls) НЕ працював на моєму ноутбуці XP. Це зробили -

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

Сподіваюся, це корисно


якщо ви можете встановити розташування індексу буфера для початку, це був би єдиний найпростіший підхід
DevilInDisguise

1
Якщо процес повинен був перерватися, я думаю, ви побачите відставання з видаленням друку.out перед іншими.
TrevorLee


2

Це спрацює, якщо ви робите це в Bluej або будь-якому іншому подібному програмному забезпеченні.

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

1

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


2
Це лише натяк, можливо, хтось захоче очистити екран, насправді
Сарц

@Sarz: і власне "очищення екрана" само по собі не має належного сенсу
Gyom

0

Потрібно використовувати контрольні символи як зворотну косу рису (\ b) та повернення каретки (\ r). За умовчанням він вимкнений, але перегляд консолі може інтерпретувати ці елементи керування.

Windows> Налаштування та Запуск / Налагодження> Консоль та виберіть Інтерпретувати символи управління ASCII, щоб увімкнути це

Налаштування консолі в Eclipse

Після цих конфігурацій ви можете керувати консоллю керуючими символами, такими як:

\ t - вкладка.

\ b - зворотний простір (крок назад у тексті або видалення одного символу).

\ n - новий рядок.

\ r - повернення вагона. ()

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

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

Більше інформації на сайті: https://www.eclipse.org/eclipse/news/4.14/platform.php


-2

Вам потрібно використовувати JNI.

Перш за все використовуйте create .dll за допомогою візуальної студії, що викликає систему ("cls"). Після цього використовуйте JNI для використання цього DDL.

Я знайшов цю статтю приємною:

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


Це для мене робота. У мене справжній проект, що використовує JNI для очищення екрана в JAVA.
Денні

В Угорщині ми говоримо "Він завдає муху булавою".
Ambrus Tóth
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.