В приложении Java я использую некоторые вызовы System.out.println()
. Теперь я хочу найти способ программно удалить этот материал.
Я не мог найти какое-либо решение с Google, так что есть ли какие-либо подсказки?
В приложении Java я использую некоторые вызовы System.out.println()
. Теперь я хочу найти способ программно удалить этот материал.
Я не мог найти какое-либо решение с Google, так что есть ли какие-либо подсказки?
Вы можете напечатать символ обратного пробела \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");
b) Поместите пучок новых строк (это делает иллюзию, что экран ясен)
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. Существует способ очистки экрана окна терминала. Попробуйте следующее: -
System.out.print ('\f');
это очистит все, что напечатано до этой строки. Но это не работает в командной строке.
System.out
является PrintStream
, и сам по себе не предоставляет никакого способа изменить то, что получает вывод. В зависимости от того, что поддерживает этот объект, вы можете или не сможете его модифицировать. Например, если вы перенаправляете System.out
в файл журнала, вы можете изменить этот файл после факта. Если он идет прямо на консоль, текст исчезнет, как только он достигнет вершины консольного буфера, но нет возможности программно с ним связать.
Я не уверен, что вы надеетесь достичь, но вы можете подумать о создании прокси-сервера PrintStream
для фильтрации сообщений по мере их вывода, вместо того, чтобы пытаться удалить их после факта.
Чтобы очистить экран "Вывод", вы можете имитировать реального человека, нажав 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);
}
Существует два разных способа очистки терминала в BlueJ. Вы можете заставить BlueJ автоматически очищать терминал до каждого интерактивного вызова метода. Чтобы сделать это, активируйте опцию "Очистить экран при вызове метода" в меню "Параметры" терминала. Вы также можете очистить терминал программно из вашей программы. Печать символа формы (Unicode 000C) очищает терминал BlueJ, например:
System.out.print('\u000C');
Просто добавьте к BalusC anwswer...
Повторное использование System.out.print("\b \b")
с задержкой дает то же самое поведение, что и при удалении backspaces в {Windows 7 command console/Java 1.6}
Я нашел, что в 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);
}
Проще всего это сделать:
System.out.println("\f");
System.out.println("\u000c");
Я нашел решение для очистки консоли в 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, это должно работать.
Ответ 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
)
Для интеллигентной консоли у 0x08
работал символ 0x08
!
System.out.print((char) 8);
Я успешно использовал следующее:
@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");