Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何捕获java.io.PrintStream并将其输出放在一个窗格中?_Java_Jeditorpane_Printstream - Fatal编程技术网

如何捕获java.io.PrintStream并将其输出放在一个窗格中?

如何捕获java.io.PrintStream并将其输出放在一个窗格中?,java,jeditorpane,printstream,Java,Jeditorpane,Printstream,我正在尝试制作一个Java程序,用户可以在其中从计算机中选择任何.class或.jar文件。然后,我的程序将弹出一个JInternalFrame,其中有一个JEditorPane作为控制台,捕获用户程序的任何控制台输出。请注意,我不想只捕获System.err或System.out调用,而是捕获所有转到控制台的PrintStream调用 (来自的单个问题)您可以捕获通过系统打印的所有内容 import java.io.*; class SystemOutLogging { publi

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


(来自的单个问题)

您可以捕获通过
系统打印的所有内容

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.out.println
打印的内容,您就有麻烦了,因为
System.out
是静态的,因此如果启动多个“子程序”,您将陷入混乱(因为您无法将单独的
System
类交给每个子程序)

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


(另一方面,当我考虑它时,您可能会检查
println
实现中的当前线程组,并从中确定实际调用
println
方法的子程序)

您可以捕获通过
系统打印的所有内容。out
使用如下方式:

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.out.println
打印的内容,您就有麻烦了,因为
System.out
是静态的,因此如果启动多个“子程序”,您将陷入混乱(因为您无法将单独的
System
类交给每个子程序)

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


(另一方面,当我考虑它时,您可能会检查
println
实现中的当前线程组,并从中确定实际调用
println
方法的子程序)

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

见:


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

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

见:


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

NetBeans等IDE似乎在捕获多个程序的System.out调用时没有问题。此外,这并没有解决将所有调用放在一个JeditorPaneneBeans中的问题,Eclipse是极其复杂的软件。不要期望能够复制他们的系统。我提供的示例提供了一个“流程”方法。您可以使用该方法中的字符串执行任何需要的操作。从这一点来说,将它附加到JEditorPane上应该不会太难。虽然一个程序员在尝试Eclipse或NetBeans大小的东西之前确实应该畏缩不前,但它们仍然只是程序。复制它们的一点功能(在本例中是捕获流程输出)并不一定很难,也不一定是超出合理预期的事情。@Burleigh Bear同意。然而,在这种情况下,他不想产生一个新的进程。就我个人而言,我不知道如何优雅地解决这个问题……啊,我没有读过他的另一个问题。我真傻。顺便说一句,我喜欢你回答中的p.s+1.NetBeans之类的IDE似乎在捕获多个程序的System.out调用时没有问题。此外,这并没有解决将所有调用放在一个JeditorPaneneBeans中的问题,Eclipse是极其复杂的软件。不要期望能够复制他们的系统。我提供的示例提供了一个“流程”方法。您可以使用该方法中的字符串执行任何需要的操作。从这一点来说,将它附加到JEditorPane上应该不会太难。虽然一个程序员在尝试Eclipse或NetBeans大小的东西之前确实应该畏缩不前,但它们仍然只是程序。复制它们的一点功能(在本例中是捕获流程输出)并不一定很难,也不一定是超出合理预期的事情。@Burleigh Bear同意。然而,在这种情况下,他不想产生一个新的进程。就我个人而言,我不知道如何优雅地解决这个问题……啊,我没有读过他的另一个问题。我真傻。顺便说一句,我喜欢你回答中的p.s+1、如果你阅读了相关的问题,你就会知道他不认为这是一种选择。如果你阅读了相关的问题,你就会知道他不认为这是一种选择。