如何删除System.out.println()打印到控制台的内容?

时间:2011-09-22 22:03:38

标签: java

在Java应用程序中,我正在使用System.out.println()的一些调用。现在我想找到一种以编程方式删除这些内容的方法。

我找不到谷歌的任何解决方案,所以有任何提示吗?

15 个答案:

答案 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控制台不遵循它。

看看:http://www.termsys.demon.co.uk/vtansi.htm

答案 3 :(得分:6)

我正在使用blueJ进行java编程。有一种方法可以清除它终端窗口的屏幕。试试这个: -

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

这将清除此行之前打印的内容。但这在命令提示符下不起作用。

答案 4 :(得分:5)

System.outPrintStream,本身并没有提供任何方法来修改输出内容。根据支持该对象的内容,您可能会也可能无法修改它。例如,如果要将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");