禁用System.err

21

有没有一种方法可以设置流System.err,使得所有写入该流的内容都被忽略?(即丢弃而不是输出)

6个回答

43
System.setErr(new PrintStream(new OutputStream() {
    public void write(int b) {
    }
}));

7
我找到了另一种方法:System.err.close()。 - elou
@elou 你知道如何在关闭 System.err 后恢复它的原始状态吗? - Noumenon
2
嗨@Noumenon,我已经调查了这个问题,并得出了与此处相同的结论:无法重新打开。如果您需要重新打开,请在用System.setErr(..)覆盖之前备份流PrintStream _err = System.err;。之后可以使用System.setErr(_err)进行恢复。问候,Éric。 - elou

18
你可以使用 System.setErr() 来设置一个什么也不做的 PrintStream。
查看 @dogbane 的示例代码。

5

只需将错误设置为虚拟实现:

System.setErr(new PrintStream(new OutputStream() {
            @Override
            public void write(int arg0) throws IOException {
                // keep empty
            }
        }));

您需要特殊权限才能执行该操作。

RuntimePermission("setIO")

1
您可以将错误流重定向到/dev/null
OutputStream output = new FileOutputStream("/dev/null");
PrintStream nullOut = new PrintStream(output);
System.setErr(nullOut);

1
这个是针对*nix系统的特定内容。 - asgs
2
注意:在Windows上,请使用“NUL:”而不是“/dev/null”。 - dogbane
在Windows中不存在/dev/null(但您可以在其中使用NUL)。 - ratchet freak
2
@rachet freak,如果你的电脑上有一个名为“dev”的目录,那么它很快就会出现。 ;) (在我的电脑上,“dev”是开发的缩写) - Peter Lawrey
FileOutputStream 对于这个任务来说有点过头了,你可以使用 common-io 的 NullOutputStream()。 - Daniel Hári

0

0
其他答案并没有错误。 我认为使用nullOutputStream()函数从PrintStream类中,可以更容易地理解发生了什么,减少了额外的开销。
System.setErr(new PrintStream(PrintStream.nullOutputStream()));

如果您想在覆盖之前恢复原始的错误流,请先保存它。
PrintStream origStream = System.err;
System.setErr(new PrintStream(PrintStream.nullOutputStream()));

// Do your Sutff here which is printing to System.err

System.setErr(origStream);

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