代码之家  ›  专栏  ›  技术社区  ›  Ky -

如何捕获java.io.PrintStream将其输出放在JEditorPane中?

  •  0
  • Ky -  · 技术社区  · 14 年前

    我试图制作一个Java程序,用户可以在其中选择 .class .jar 他们电脑里的文件。我的程序会弹出一个 JInternalFrame JEditorPane 在它中作为控制台,捕获来自用户程序的任何控制台输出。请注意,我不想只捕获System.err或System.out调用,而是捕获到控制台的所有PrintStream调用。

    (个人问题来自 IDE-Style program running )

    2 回复  |  直到 8 年前
        1
  •  3
  •   aioobe    14 年前

    你可以抓到所有打印出来的东西 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

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

    (p.s.当我想到它时,您可能可以在 println 印刷品 方法)

        2
  •  0
  •   Burleigh Bear    14 年前

    如果使用Runtime.exec()启动用户的.jar文件,您将得到一个进程对象。该对象将允许您访问已启动的进程System.out、System.in和System.err流。

    见: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html

    您可以从err和out流中读取数据,并使用常用的setText类型方法附加到JEditorPane中。