隐藏Java输出

时间:2010-10-08 22:41:37

标签: java console

我正在使用外部库。当调用此库的方法然后它在控制台上输出一些文本。我想从控制台隐藏此文本。怎么可能?

先谢谢

4 个答案:

答案 0 :(得分:5)

你可以重新定义system.out(我相信它是System.setOut())我相信你可以将它设置为NULL(更正 - 你不能将它设置为NULL),但你可以将它设置为任何输出流

我曾经做过一次有趣的事情。我保存了“System.out”,然后使用“print”方法中的代码将其重定向到我自己的输出流 - 只要有人打印到流中,就会调用该方法。

每次输入一行输入到此类时,我都会创建一个堆栈跟踪,抓取跟踪并深入查看调用System.out.println()方法的方法。此时我可以在线前加上即时记录功能 - 它甚至可以显示行号。

这可能很慢,但可以很容易地打开和关闭。

我也可以在不触及源代码的情况下完成您想要的所有过滤。有时候我会过滤一个包,有时我会过滤一个类,有时它会以“BK:”开头的字符串,这只会打印出我的消息。

总体而言,为生产删除所有调试输出是非常有趣和轻而易举的。

(我不推荐生产代码获取堆栈跟踪的东西,即使我没注意到它也应该很慢)

// class variable
public static final OutputStream out;

{
    out=System.getOutputStream();// I may have the actual name wrong, but it's close
    System.setOutputStream(new OutputStreamThatDoesNothing());
}

此时拨打任何电话:

Redirect.out("Hello");

应该像调用System.out一样。

由于没有这方面的魔力,如果你真的想要,你也可以这样做:

OutputStream tmp=System.getOutputStream();
System.setOutpuatStream(nullStream);
callOffensiveLibraryMethod();
System.setOutputStream(tmp);

这只会消除该调用中的输出。如果你的应用程序是多线程的,那么非常糟糕。

答案 1 :(得分:4)

private PrintStream realSystemOut = System.out;
private static class NullOutputStream extends OutputStream {
    @Override
    public void write(int b){
         return;
    }
    @Override
    public void write(byte[] b){
         return;
    }
    @Override
    public void write(byte[] b, int off, int len){
         return;
    }
    public NullOutputStream(){
    }
}
void someMethod(){
    System.setOut(new PrintStream(new NullOutputStream());
    realSystemOut.println("Hello World!"); //prints Hello World!
    System.out.println("Hello World!"); //nothing!
    System.setOut(realSystemOut);
    System.out.println("Hello World!"); //prints Hello World!
}

答案 2 :(得分:2)

将System.out设置为NullOutputStream。 apacahe.commons有一个可用。

如果你想打印它,你可以写一个有趣的黑客。

private static final PrintStream SYSTEM_OUT = System.out();

public static void debug(String debug){
     SYSTEM_OUT.println(debug);
}

代码中的其他内容

  System.setOut(new PrintStream(new NullOutputStream()));  

答案 3 :(得分:2)

对于那些寻求2020版本并且也不需要外部库作为空流的用户:

PrintStream out = System.out;
System.setOut(new PrintStream(OutputStream.nullOutputStream()));
//
//do stuff with library...
//
System.setOut(out);

自Java 11起可用。