3 回答

TA貢獻1848條經驗 獲得超2個贊
你不能做你所要求的。該進程中只有一個標準輸出流,它與插件代碼和您的代碼共享。
您可以將插件代碼作為單獨的進程運行并捕獲輸出流。您可以使用“java.home”系統(tǒng)屬性查找啟動進程的 JRE 的位置,并使用它形成命令行來啟動插件 jar。

TA貢獻1795條經驗 獲得超7個贊
System.out 是每個進程的,每個類加載器不可能有不同的流。如果您迫切需要讓系統(tǒng)從插件中退出,有兩種選擇: 1. 如果您有權訪問插件的代碼,則將輸出流傳遞給您的插件,并使插件使用此流。2. 將插件作為外部進程運行。這樣您就可以重定向其輸出。另一種選擇:如果您可以區(qū)分插件輸出,您可以實現(xiàn)自己的路由輸出流并將其設置為系統(tǒng)輸出。

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 添加前綴,以便它們正常執(zhí)行。沒有前綴的(來自您的插件)直接進入定義的輸出流(在我的示例中為文件輸出流)
它的使用方式如下:
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");
也許這會對你有幫助:)
編輯:我將其切換,以便帶有前綴的字符串進入正常的輸出
添加回答
舉報