Java:如何显式地将System.err重定向到控制台(即恢复默认行为)?

dB'*_*dB' 4 java max-msp-jitter

我正在为一个名为Max/MSP的封闭源应用程序编写一个插件.要使用Max/MSP,我的代码需要扩展供应商提供的类(com.cycling74.max.MaxObject).此类将覆盖System.err,以便调用将System.err.println消息定向到应用程序提供的特殊错误日志.

这种行为在部署中很好,但在测试期间存在问题.我现在正在尝试编写一个在宿主应用程序之外运行我的代码的测试套件.当我这样做时,调用System.err引发异常,因为应用程序的错误日志不可用.

有谁知道如何"撤消"Max/MSP的错误重定向,以便在测试期间调用System.err.println显示在java控制台中?

编辑

我尝试了@MadProgrammer建议在创建Max对象之前缓存对错误PrintStream的引用.

import com.cycling74.max.*;

public class MyMaxObject extends MaxObject{

    public MyMaxObject(){}

    public static void main(String[] args){
        PrintStream oldError = System.err;
        MyMaxObject o = new MyMaxObject();
        System.setErr(oldError);
}
Run Code Online (Sandbox Code Playgroud)

我不能让这个工作.当我在调试器中运行此代码时,我发现在main方法的第一行System.err有类型com.cycling74.io.ErrorStream.所以似乎重定向已经发生了.如果是这种情况,如何在重定向之前获取对错误流的引用?(如果不是在顶部,我在哪里可以放置代码Main?)

编辑2

好吧,想通了.我只需要将我的测试代码(例如Main上面的方法)移动到一个单独的类中.一旦我这样做了,@ MadProgrammer的解决方案就完美无缺.

Mad*_*mer 6

首先,您需要System.err在重定向之前引用它.

PrintStream oldError = System.err;
Run Code Online (Sandbox Code Playgroud)

一旦你初始化MaxObject(或系统的任何部分覆盖System.err你需要重新分配参考...

System.setErr(oldError);
Run Code Online (Sandbox Code Playgroud)