0

我正在尝试制作一个 Java 程序,用户可以在其中从他们的计算机中选择任何文件.class或文件。.jar然后,我的程序将弹出一个JInternalFrame带有 aJEditorPane作为控制台,捕获用户程序的任何控制台输出。请注意,我不想只捕获 System.err 或 System.out 调用,而是要捕获所有进入控制台的 PrintStream 调用。

IDE-Style 程序运行中的个别问题)

4

2 回答 2

3

您可以像这样捕获通过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.setErrSystem.setIn它的工作原理类似。)

如果你想捕捉“子程序”打印出来的东西,System.out.println你就有麻烦了,因为System.out它是一个静态的,所以如果你启动多个“子程序”,你最终会一团糟(因为你不能把一个单独的System类交给每个子程序)。

在这种情况下,老实说,我认为通过 ProcessBuilder 启动一个单独的进程会更好。结果过程的标准输入/输出流可以很容易地被记录下来。

(ps当我想到它时,您可能会检查实现中的当前线程组println,并从中确定实际调用该println方法的子程序)

于 2010-10-29T19:43:41.573 回答
0

如果您使用 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。

于 2010-10-29T21:18:59.810 回答