隐藏Java输出结果

5
我正在使用一个外部库。当我调用这个库的某个方法时,它会在控制台上输出一些文本。我想隐藏控制台上的这些文本。有什么办法吗?
提前感谢。

2
使用编写更好的库。第三方库不应直接写入控制台。 - Kirk Woll
...或者查看库的文档。也许它包含了一个禁用它的函数或方法。 - Adonais
你确定你没有混淆“普通”的stdout调用和像log4j/util.Logging/slf4j等的logger调用吗?否则,这只是正确配置记录器的问题。它是哪个库? - BalusC
4个回答

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

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

你不能将它设置为null。当调用System.out.print()函数时,这会导致NullPointerException。但是你可以使用另一个输出流。 - Adonais
这种方法的唯一问题是它也会将我的代码的输出重定向到指定的打印流。 - Novice
1
你仍然可以打印到“原始”的输出。 - Bill K

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!
}

3

对于那些寻找2020年版本并且不需要外部库的空流的人:

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

自Java 11版本起可用。


2

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

如果您想相应地打印出来,可以编写一个有趣的hack。

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

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

代码的其他部分

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接