在Java应用程序中,我正在使用System.out.println()
的一些调用。现在我想找到一种以编程方式删除这些内容的方法。
我找不到谷歌的任何解决方案,所以有任何提示吗?
答案 0 :(得分:55)
您可以打印退格字符\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");
注意:在Mars(4.5)之前的旧版本中,这在Eclipse控制台中无法正常运行。然而,这在命令控制台中完美无缺。另请参阅How to get backspace \b to work in Eclipse's console?
答案 1 :(得分:21)
不支持使用Java清除屏幕,但您可以尝试一些黑客来实现此目的。
a)使用OS-depends命令,如下所示:对于Windows:
Runtime.getRuntime().exec("cls");
b)放入一堆新行(这会让人觉得屏幕很清晰)
c)如果您想关闭System.out,可以试试这个:
System.setOut(new PrintStream(new OutputStream() {
@Override public void write(int b) throws IOException {}
}));
答案 2 :(得分:16)
您可以使用向上光标删除一行,删除文本,或者只使用旧文本用新文本覆盖。
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"));
这是标准配置,但根据维基百科,Windows控制台不遵循它。
答案 3 :(得分:6)
我正在使用blueJ进行java编程。有一种方法可以清除它终端窗口的屏幕。试试这个: -
System.out.print ('\f');
这将清除此行之前打印的内容。但这在命令提示符下不起作用。
答案 4 :(得分:5)
System.out
是PrintStream
,本身并没有提供任何方法来修改输出内容。根据支持该对象的内容,您可能会也可能无法修改它。例如,如果要将System.out
重定向到日志文件,则可以在事后修改该文件。如果它直接进入控制台,文本一旦到达控制台缓冲区的顶部就会消失,但是没有办法以编程方式搞乱它。
我不确定您希望完成的是什么,但您可能需要考虑创建一个代理PrintStream
来过滤消息,而不是在事件发生后尝试删除它们。 / p>
答案 5 :(得分:4)
要清除输出屏幕,您可以按 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);
}
答案 6 :(得分:4)
在BlueJ中有两种不同的清除终端的方法。您可以让BlueJ在每次交互式方法调用之前自动清除终端。要执行此操作,请激活终端“选项”菜单中的“在方法调用时清除屏幕”选项。您也可以在程序中以编程方式清除终端。打印换页字符(Unicode 000C)会清除BlueJ终端,例如:
System.out.print('\u000C');
答案 7 :(得分:3)
只是添加到BalusC的anwswer ......
延迟重复调用System.out.print("\b \b")
会产生与我们在{Windows 7命令控制台/ Java 1.6}中命中退格时完全相同的行为
答案 8 :(得分:3)
我发现在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);
}
答案 9 :(得分:1)
最简单的方法是:
System.out.println("\f");
System.out.println("\u000c");
答案 10 :(得分:0)
我找到了一个在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类,这应该可行。
答案 11 :(得分:0)
BalusC的答案对我不起作用(Ubuntu上的bash控制台)。有些东西仍留在最后。所以我再次用空格翻过来。下面的代码段中使用了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's Strings类也提供了类似的repeat
方法)
答案 12 :(得分:0)
对于intellij控制台,0x08
字符对我有用!
System.out.print((char) 8);
答案 13 :(得分:-1)
我已成功使用以下内容:
@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
,应该足够简单,可以自己编写。
答案 14 :(得分:-1)
此解决方案适用于要删除某些System.out.println()输出的情况。它将输出限制为在控制台上打印并打印其他输出。
PrintStream ps = System.out;
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {}
}));
System.out.println("It will not print");
//To again enable it.
System.setOut(ps);
System.out.println("It will print");