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


70

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

我在Google上找不到任何解决方案,所以有什么提示吗?


3
您所说的“删除”是什么意思?您是说它在某处创建了文件,并且要删除该文件吗?还是您希望程序不将数据输出到控制台?或者是其他东西?您没有提供足够多的信息来让任何人了解您想要什么,更不用说帮助您了。说明如何调用该程序以及要删除的“内容”在哪里。
Jim Garrison

3
您是说要从代码中删除System.out.println()调用?还是您希望该代码保持不变,但是即使代码执行System.out.println(),也没有写入sysout的内容?Unix / Windows?
Kashyap

2
获得的经验教训:不要按标准打印:D下次使用记录仪
Nate W.

我想从控制台,终端,屏幕中删除内容。

1
清除内容,我想他想要的是
Rami Shareef

Answers:


69

您可以将退格字符打印的\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控制台中无法正常工作。但是,这在命令控制台中可以正常工作。另请参阅如何使退格\ b在Eclipse的控制台中工作?


25

不支持使用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 {}
}));

好建议。对于(c),为什么会引发IOException?据我了解,PrintStream将吞没IOException。
emory

@emory:实际上,这里没有必要,我只是在eclipse中创建了存根,并且已经向我插入了它(这与OutputStream中的定义完全相同)
lukastymo 2011年

@emory-一个更令人信服的原因throws是,方法主体不会引发异常。但这都是挑剔的。
斯蒂芬·C

支持,但是如何将System.setOut切换回正常状态?我没有找到System.getOut
taxeeta

Runtime.getRuntime().exec("cls");不起作用。有关详细信息,请参见此答案
Holger

22

您可以使用光标向上删除行,擦除文本,或者简单地用新文本覆盖旧文本。

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


从powershell运行时,在我的Scala REPL / sbt中的Windows 7中似乎可以正常工作。谢谢!
卢西亚诺

也可以在Linux(Bash,xterm)终端上使用。
try-catch-finally

1
在Mac上也很好用
arcuri82 '17

与Cygwin一起在寡妇10上运行良好
hogi

8

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

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

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


7

有两种不同的方法可以清除BlueJ中的终端。您可以让BlueJ在每次交互式方法调用之前自动清除终端。为此,请激活终端“选项”菜单中的“方法调用时清除屏幕”选项。您也可以从程序内部以编程方式清除终端。打印换页符(Unicode 000C)会清除BlueJ终端,例如:

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

6

System.outPrintStream,并且本身不提供任何方式修改获取输出的内容。根据支持该对象的内容,您可能会或可能无法对其进行修改。例如,如果您要重定向System.out到日志文件,则可以在事后修改该文件。如果直接进入控制台,则文本到达控制台缓冲区的顶部后将消失,但是无法以编程方式对其进行处理。

我不确定您到底想完成什么,但是您可能要考虑创建一个代理PrintStream以在消息得到输出时过滤消息,而不是在事后尝试删除它们。


你试过了\r吗?它可以跳回到该行的开头并创建包含更新信息的行...
Erk

@Erk:类似于此答案(使用\b),但\r 不同环境对它的解释不同。我的回答的重点是,即使这System.out是直接在控制台上进行的(这是Java程序的默认行为),您也不应假定它将始终在此进行。可能是将内容发送到文件中,在这种情况下,您将得到一个文件,其中包含要删除的文本和特殊字符。
StriplingWarrior

您当然是对的。再次查看OP,我意识到这只是删除println:ed的东西。对于某种“点击信息栏”,这是我自己的解释。而且,是的,这种输出在文件中看起来很糟糕……除非您用来打印它的程序像控制台那样解释\ r……但我想文本编辑器不会那样。
Erk,

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

1
它只能从机器人的按键中删除字符,我可以将其用于System.out.println()吗?
丹丹2014年

4

只是为了增加BalusC的答案...

System.out.print("\b \b")延迟调用会产生与在{Windows 7命令控制台/ Java 1.6}中按退格键时完全相同的行为。


4

我发现在Eclipse Mars中,如果可以安全地假设替换它的行至少与要擦除的行一样长,只需打印'\ r'(回车)就可以使光标返回到行首以覆盖您看到的所有字符。我想如果新行较短,则可以用空格来弥补不同之处。

在日食中,此方法对于实时更新进度百分比非常方便,例如在我从其中一个程序中摘录的代码段中。它是从网站下载媒体文件的程序的一部分。

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

2

最简单的方法是:

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

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

4
您能解释一下如何删除吗?
Glenn Teitelbaum


1

我找到了在Eclipse IDE中擦除控制台的解决方案。它使用机器人类。请查看下面的代码和标题以获取解释:

   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类,则此方法应该起作用。


@EJP 1)这是去年的内容,2)如果他使用eclipse,这是一个潜在的解决方案,3)和我一样,Eclipse的公认答案也提到了Eclipse
凌晨

1

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的Strings类也提供了类似的repeat方法)


0

我已成功使用以下内容:

@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,应该足够简单以编写自己的Java 。


2
这不会删除任何内容。它只是阻止它首先输出。不是要求什么。也不完整。
user207421

-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");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.