在Java应用里,System.err是一个PrintStream对象,用于输出错误信息。所谓重定向至黑洞,就是让这些错误内容不再显示,而是写入无效位置。在类Unix系统中黑洞设备是/dev/null,Windows下可用NUL。我们也可以直接用不执行任何写入的空流来替代。

使用空PrintStream重定向
最干净的做法是构造一个什么都不做的PrintStream,把它设给System.err。下面的代码演示了如何把标准错误输出重定向到一个丢弃所有数据的流。
import java.io.PrintStream;
import java.io.OutputStream;
public class RedirectErrToNull {
public static void main(String[] args) {
// 创建一个不写入任何内容的输出流
OutputStream nullOut = new OutputStream() {
@Override
public void write(int b) {
// 丢弃数据
}
};
// 用该流构造PrintStream
PrintStream blackhole = new PrintStream(nullOut);
// 重定向标准错误输出
System.setErr(blackhole);
// 以下信息不会在控制台显示
System.err.println("这条错误被丢进黑洞");
System.out.println("标准输出正常显示");
}
}
重定向到系统黑洞设备
如果想真正写入系统黑洞文件,可以用FileOutputStream指向/dev/null或NUL,然后包装为PrintStream。
import java.io.FileOutputStream;
import java.io.PrintStream;
public class RedirectToDevNull {
public static void main(String[] args) throws Exception {
String blackholePath;
if (System.getProperty("os.name").toLowerCase().contains("win")) {
blackholePath = "NUL";
} else {
blackholePath = "/dev/null";
}
PrintStream ps = new PrintStream(new FileOutputStream(blackholePath));
System.setErr(ps);
System.err.println("错误进入黑洞设备");
}
}
恢复原始错误输出
重定向之前最好保存原来的System.err,以便后续恢复。
import java.io.PrintStream;
import java.io.OutputStream;
public class RestoreErr {
public static void main(String[] args) {
PrintStream originalErr = System.err;
// 重定向到空流
System.setErr(new PrintStream(new OutputStream() {
public void write(int b) {}
}));
System.err.println("看不见");
// 恢复
System.setErr(originalErr);
System.err.println("错误输出已恢复");
}
}
注意事项
- 重定向会影响整个JVM进程,多线程下所有错误都进黑洞。
- 某些第三方库可能缓存System.err,重定向后行为需自测。
- 用空输出流比依赖操作系统黑洞更跨平台。
通过上述方式,你可以轻松将Java中的PrintStream标准错误输出重定向至黑洞,保持控制台整洁。
PrintStreamSystem_errredirect修改时间:2026-07-26 10:51:34