如何在Java中将控制台内容重定向到文本区域?

如何在Java中将控制台内容重定向到文本区域?,java,swing,jtextarea,Java,Swing,Jtextarea,我试图在java的文本区域中获取console的内容 例如,如果我们有这个代码 class FirstApp { public static void main (String[] args){ System.out.println("Hello World"); } } 我想将“Hello World”输出到一个textArea,我必须选择什么操作?您必须将系统重定向到PrintStream的一个自定义、可观察的子类,这样添加到该流的每个字符或行都可以更新te

我试图在java的文本区域中获取console的内容

例如,如果我们有这个代码

class FirstApp {
    public static void main (String[] args){
        System.out.println("Hello World");
    }
}

我想将“Hello World”输出到一个textArea,我必须选择什么操作?

您必须将
系统重定向到
PrintStream
的一个自定义、可观察的子类,这样添加到该流的每个字符或行都可以更新textArea的内容(我想,这是一个AWT或Swing组件)


PrintStream
实例可以使用
ByteArrayOutputStream
创建,这将收集重定向的
系统的输出。out

方法之一是将
系统输出流
设置为
管道输出流
,并将其连接到从中读取的
管道输出流
,以向组件添加文本,例如

PipedOutputStream pOut = new PipedOutputStream();   
System.setOut(new PrintStream(pOut));   
PipedInputStream pIn = new PipedInputStream(pOut);  
BufferedReader reader = new BufferedReader(new InputStreamReader(pIn));
你看过下面的链接了吗?如果没有,那么你必须


显示了一种解决方案。

我找到了这个简单的解决方案:

首先,必须创建一个类来替换标准输出:

public class CustomOutputStream extends OutputStream {
    private JTextArea textArea;

    public CustomOutputStream(JTextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void write(int b) throws IOException {
        // redirects data to the text area
        textArea.append(String.valueOf((char)b));
        // scrolls the text area to the end of data
        textArea.setCaretPosition(textArea.getDocument().getLength());
        // keeps the textArea up to date
        textArea.update(textArea.getGraphics());
    }
}
然后按如下方式替换标准:

JTextArea textArea = new JTextArea(50, 10);
PrintStream printStream = new PrintStream(new CustomOutputStream(textArea));
System.setOut(printStream);
System.setErr(printStream);
问题是,所有的输出将只显示在文本区域


示例来源:

这几乎是完美的,但每当控制台输出文本区域时,就会闪烁一束。使用
textArea.setText(textArea.getText()+String.valueOf((char)paramInt))代替追加System.out
那样闪烁和流动。您可能必须使用SwingUtilities.invokeLater()才能工作。