我正在使用外部库。当调用此库的方法然后它在控制台上输出一些文本。我想从控制台隐藏此文本。怎么可能?
先谢谢
答案 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起可用。