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

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

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

Вы можете напечатать символ backspace \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?

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

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

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

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

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

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

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

 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

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

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

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

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

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

Чтобы очистить экран вывода, вы можете имитировать реального человека, нажимая CTRL + L (который очищает выход). Вы можете добиться этого, используя class 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); } 

Просто чтобы добавить к ответу BalusC …

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

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

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

  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); } в  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); } 

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

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

Я нашел решение для очистки консоли в Eclipse IDE. Он использует class 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 и не импортировали эти classы Java, это должно сработать.

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

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

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

 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 также предоставляет аналогичный метод repeat )

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

 @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 , должен быть достаточно простым, чтобы написать свой собственный.

супер липкий и не стирает его, но он просто ставит новые линии до его исчезновения. Это просто визуально, а не что-то слишком полезно. Я только предлагаю, поскольку я использовал это для некоторого искусства 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"); 
Interesting Posts
Давайте будем гением компьютера.