我正在尝试制作一个 Java 程序,用户可以在其中从他们的计算机中选择任何文件.class
或文件。.jar
然后,我的程序将弹出一个JInternalFrame
带有 aJEditorPane
作为控制台,捕获用户程序的任何控制台输出。请注意,我不想只捕获 System.err 或 System.out 调用,而是要捕获所有进入控制台的 PrintStream 调用。
(IDE-Style 程序运行中的个别问题)
我正在尝试制作一个 Java 程序,用户可以在其中从他们的计算机中选择任何文件.class
或文件。.jar
然后,我的程序将弹出一个JInternalFrame
带有 aJEditorPane
作为控制台,捕获用户程序的任何控制台输出。请注意,我不想只捕获 System.err 或 System.out 调用,而是要捕获所有进入控制台的 PrintStream 调用。
(IDE-Style 程序运行中的个别问题)
您可以像这样捕获通过System.out
使用打印的所有内容System.setOut
:
import java.io.*;
class SystemOutLogging {
public static void main(String[] args) throws IOException,
ClassNotFoundException {
final PrintStream original = System.out;
System.setOut(new PrintStream("programlog.txt") {
public void println(String str) {
process(str + "\n");
}
public void print(String str) {
process(str);
}
private void process(String str) {
// Fill some JEditorPane
original.println("Program printed: \"" + str + "\"");
}
});
System.out.print("Hello ");
System.out.println(" World");
}
}
印刷:
Program printed: "Hello "
Program printed: " World
"
(有一个System.setErr
和System.setIn
它的工作原理类似。)
如果你想捕捉“子程序”打印出来的东西,System.out.println
你就有麻烦了,因为System.out
它是一个静态的,所以如果你启动多个“子程序”,你最终会一团糟(因为你不能把一个单独的System
类交给每个子程序)。
在这种情况下,老实说,我认为通过 ProcessBuilder 启动一个单独的进程会更好。结果过程的标准输入/输出流可以很容易地被记录下来。
(ps当我想到它时,您可能会检查实现中的当前线程组println
,并从中确定实际调用该println
方法的子程序)
如果您使用 Runtime.exec() 启动用户的 .jar 文件,您将获得一个 Process 对象。该对象将允许您访问已启动的进程 System.out、System.in 和 System.err 流。
请参阅:http: //download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html
您可以从 err 和 out 流中读取,并使用通常的 setText 类型方法附加到您的 JEditorPane。