如何捕获java.io.PrintStream并将其输出放在一个窗格中?
我正在尝试制作一个Java程序,用户可以在其中从计算机中选择任何如何捕获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
.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、如果你阅读了相关的问题,你就会知道他不认为这是一种选择。如果你阅读了相关的问题,你就会知道他不认为这是一种选择。