3 回答
TA贡献1848条经验 获得超2个赞
你不能做你所要求的。该进程中只有一个标准输出流,它与插件代码和您的代码共享。
您可以将插件代码作为单独的进程运行并捕获输出流。您可以使用“java.home”系统属性查找启动进程的 JRE 的位置,并使用它形成命令行来启动插件 jar。
TA贡献1795条经验 获得超7个赞
System.out 是每个进程的,每个类加载器不可能有不同的流。如果您迫切需要让系统从插件中退出,有两种选择: 1. 如果您有权访问插件的代码,则将输出流传递给您的插件,并使插件使用此流。2. 将插件作为外部进程运行。这样您就可以重定向其输出。另一种选择:如果您可以区分插件输出,您可以实现自己的路由输出流并将其设置为系统输出。
TA贡献1780条经验 获得超1个赞
我做了这个解决方法:
public class CustomPrintStream extends PrintStream {
private String prefix;
public CustomPrintStream(String prefix, OutputStream out) {
super(out);
this.prefix = prefix;
}
@Override
public void println(String s) {
if(s.startsWith(prefix))
super.println(s);
else {
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println(s);
System.setOut(this);
}
}
}
这使您可以向每个主程序的 System.out.printlns 添加前缀,以便它们正常执行。没有前缀的(来自您的插件)直接进入定义的输出流(在我的示例中为文件输出流)
它的使用方式如下:
System.setOut(new CustomPrintStream("test", new FileOutputStream("C:\\out.txt"))); //Of course you can also use ByteArrayOutputStream, as you did before
System.out.println("test 1"); //this goes into the standard outstream
System.out.println("2"); //and this goes into the fileoutputstream
System.out.println("test 3");
也许这会对你有帮助:)
编辑:我将其切换,以便带有前缀的字符串进入正常的输出
添加回答
举报