Подтвердить что ты не робот

Как удалить материал, напечатанный на консоль System.out.println()?

В приложении Java я использую некоторые вызовы System.out.println(). Теперь я хочу найти способ программно удалить этот материал.

Я не мог найти какое-либо решение с Google, так что есть ли какие-либо подсказки?

4b9b3361

Ответ 1

Вы можете напечатать символ обратного пробела \b столько раз, сколько ранее были напечатаны.

System.out.print("hello");
Thread.sleep(1000); // Just to give the user a chance to see "hello".
System.out.print("\b\b\b\b\b");
System.out.print("world");

Примечание. Это не работает безупречно в консоли Eclipse в более старых версиях до Mars (4.5). Это прекрасно работает в командной консоли. См. Также Как получить backspace\b для работы в консоли Eclipse?

Ответ 2

Очистка экрана в Java не поддерживается, но вы можете попробовать некоторые хаки для этого.

a) Используйте команду, зависящую от ОС, как это для Windows:

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

b) Поместите пучок новых строк (это делает иллюзию, что экран ясен)

c) Если вы хотите отключить System.out, вы можете попробовать следующее:

System.setOut(new PrintStream(new OutputStream() {
    @Override public void write(int b) throws IOException {}
}));

Ответ 3

Вы можете использовать курсор, чтобы удалить строку, стереть текст или просто перезаписать старый текст новым текстом.

int count = 1; 
System.out.print(String.format("\033[%dA",count)); // Move up
System.out.print("\033[2K"); // Erase line content

или очистить экран

System.out.print(String.format("\033[2J"));

Это стандартно, но согласно wikipedia консоль Windows не следует за ней.

Посмотрите: http://www.termsys.demon.co.uk/vtansi.htm

Ответ 4

Я использую blueJ для программирования Java. Существует способ очистки экрана окна терминала. Попробуйте следующее: -

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

это очистит все, что напечатано до этой строки. Но это не работает в командной строке.

Ответ 5

System.out является PrintStream, и сам по себе не предоставляет никакого способа изменить то, что получает вывод. В зависимости от того, что поддерживает этот объект, вы можете или не сможете его модифицировать. Например, если вы перенаправляете System.out в файл журнала, вы можете изменить этот файл после факта. Если он идет прямо на консоль, текст исчезнет, ​​как только он достигнет вершины консольного буфера, но нет возможности программно с ним связать.

Я не уверен, что вы надеетесь достичь, но вы можете подумать о создании прокси-сервера PrintStream для фильтрации сообщений по мере их вывода, вместо того, чтобы пытаться удалить их после факта.

Ответ 6

Чтобы очистить экран "Вывод", вы можете имитировать реального человека, нажав CTRL + L (который очищает выход). Вы можете добиться этого, используя класс Robot(), вот как вы можете это сделать:

try {
        Robot robbie = new Robot();
        robbie.keyPress(17); // Holds CTRL key.
        robbie.keyPress(76); // Holds L key.
        robbie.keyRelease(17); // Releases CTRL key.
        robbie.keyRelease(76); // Releases L key.
    } catch (AWTException ex) {
        Logger.getLogger(LoginPage.class.getName()).log(Level.SEVERE, null, ex);
}

Ответ 7

Существует два разных способа очистки терминала в BlueJ. Вы можете заставить BlueJ автоматически очищать терминал до каждого интерактивного вызова метода. Чтобы сделать это, активируйте опцию "Очистить экран при вызове метода" в меню "Параметры" терминала. Вы также можете очистить терминал программно из вашей программы. Печать символа формы (Unicode 000C) очищает терминал BlueJ, например:

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

Ответ 8

Просто добавьте к BalusC anwswer...

Повторное использование System.out.print("\b \b") с задержкой дает то же самое поведение, что и при удалении backspaces в {Windows 7 command console/Java 1.6}

Ответ 9

Я нашел, что в Eclipse Mars, если вы можете смело предположить, что строка, которую вы замените, будет, по крайней мере, до тех пор, пока строка, которую вы стираете, просто печать '\ r' (возврат каретки) позволит ваш курсор вернется в начало строки, чтобы перезаписать все символы, которые вы видите. Я полагаю, что если новая строка короче, вы можете просто различить пробелы.

Этот метод довольно удобен в eclipse для процентных значений прогресса в реальном времени, например, в этом фрагменте кода, который я вырвал из одной из моих программ. Это часть программы для загрузки медиафайлов с веб-сайта.

    URL url=new URL(link);
    HttpURLConnection connection=(HttpURLConnection)url.openConnection();
    connection.connect();
    if(connection.getResponseCode()!=HttpURLConnection.HTTP_OK)
    {
        throw new RuntimeException("Response "+connection.getResponseCode()+": "+connection.getResponseMessage()+" on url "+link);
    }
    long fileLength=connection.getContentLengthLong();
    File newFile=new File(ROOT_DIR,link.substring(link.lastIndexOf('/')));
    try(InputStream input=connection.getInputStream();
        OutputStream output=new FileOutputStream(newFile);)
    {
        byte[] buffer=new byte[4096];
        int count=input.read(buffer);
        long totalRead=count;
        System.out.println("Writing "+url+" to "+newFile+" ("+fileLength+" bytes)");
        System.out.printf("%.2f%%",((double)totalRead/(double)fileLength)*100.0);
        while(count!=-1)
        {
            output.write(buffer,0,count);
            count=input.read(buffer);
            totalRead+=count;
            System.out.printf("\r%.2f%%",((double)totalRead/(double)fileLength)*100.0);
        }
        System.out.println("\nFinished index "+INDEX);
    }

Ответ 10

Проще всего это сделать:

System.out.println("\f");

System.out.println("\u000c");

Ответ 11

Я нашел решение для очистки консоли в Eclipse IDE. Он использует класс Robot. Пожалуйста, см. Код ниже и заголовок для объяснения:

   import java.awt.AWTException;
   import java.awt.Robot;
   import java.awt.event.KeyEvent;

   public void wipeConsole() throws AWTException{
        Robot robbie = new Robot();
        //shows the Console View
        robbie.keyPress(KeyEvent.VK_ALT);
        robbie.keyPress(KeyEvent.VK_SHIFT);
        robbie.keyPress(KeyEvent.VK_Q);
        robbie.keyRelease(KeyEvent.VK_ALT);
        robbie.keyPress(KeyEvent.VK_SHIFT);
        robbie.keyPress(KeyEvent.VK_Q);
        robbie.keyPress(KeyEvent.VK_C);
        robbie.keyRelease(KeyEvent.VK_C);

        //clears the console
        robbie.keyPress(KeyEvent.VK_SHIFT);
        robbie.keyPress(KeyEvent.VK_F10);
        robbie.keyRelease(KeyEvent.VK_SHIFT);
        robbie.keyRelease(KeyEvent.VK_F10);
        robbie.keyPress(KeyEvent.VK_R);
        robbie.keyRelease(KeyEvent.VK_R);
    }

Предполагая, что вы не изменили настройки горячей клавиши по умолчанию в Eclipse и импортируете эти классы Java, это должно работать.

Ответ 12

Ответ BalusC не работал у меня (консоль bash на Ubuntu). Некоторые вещи остались в конце линии. Поэтому я снова перевернулся с пробелами. Thread.sleep() используется в нижеприведенном фрагменте, чтобы вы могли видеть, что происходит.

String foo = "the quick brown fox jumped over the fence";
System.out.printf(foo);
try {Thread.sleep(1000);} catch (InterruptedException e) {}
System.out.printf("%s", mul("\b", foo.length()));
try {Thread.sleep(1000);} catch (InterruptedException e) {}
System.out.printf("%s", mul(" ", foo.length()));
try {Thread.sleep(1000);} catch (InterruptedException e) {}
System.out.printf("%s", mul("\b", foo.length()));

где mul - простой метод, определяемый как:

private static String mul(String s, int n) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < n ; i++)
        builder.append(s);
    return builder.toString();
}

(Класс Guava Strings также предоставляет аналогичный метод repeat)

Ответ 13

Для интеллигентной консоли у 0x08 работал символ 0x08 !

System.out.print((char) 8);

Ответ 14

Я успешно использовал следующее:

@Before
public void dontPrintExceptions() {
    // get rid of the stack trace prints for expected exceptions
    System.setErr(new PrintStream(new NullStream()));
}

NullStream живет в пакете import com.sun.tools.internal.xjc.util, поэтому может быть недоступен для всех реализаций Java, но он просто OutputStream должен быть достаточно простым, чтобы написать свой собственный.

Ответ 15

супер липкий и не стирает его, но он просто ставит новые линии до его исчезновения. Это просто визуально, а не что-то слишком полезно. Я только предлагаю, поскольку я использовал это для некоторого искусства ASCII, и это было лучшее решение.

Это также зависит от размера консоли, конечно.

   System.out.print("Hello");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("world");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");
   System.out.print("\n");