如何将输出从 System.out 重定向到 JavaFx TextArea

How to redirect output from System.out to JavaFx TextArea

我正在尝试创建一个简单的应用程序,允许我在我的应用程序中将所有 System.out 重定向到 JavaFX TextArea

为此,我从 OutputStream class 创建了一个 CustomOutputStream class。这是它的代码:

//package name

//imports

public class CustomOutputStream extends OutputStream {
    private TextArea terminal;

    public CustomOutputStream(TextArea terminal) {
        this.terminal = terminal;
    }

    @Override
    public void write(int b) throws IOException {
        terminal.setText(terminal.getText() + String.valueOf((char) b));
    }
}

在我的 AppController.java 文件中,我将 TextArea 置于受保护状态,这样我就可以从同一包中的另一个 class 访问它:

@FXML
protected static TextArea textArea_terminal;

现在这个 AppContoller.java,按下一个按钮从另一个 class 调用函数 (runShell())。此函数 (runShell()) 是调用 Channel class 的另一个函数的函数,我希望将其输出放入 TextArea。因此,为此我以这种方式实现了 CustomOutputStream

PrintStream printStream = new PrintStream(new CustomOutputStream(AppController.textArea_terminal)) ;
System.setOut(printStream);

channel.setOutputStream(System.out); //channel is an instance of my class whose output I need.

不幸的是,尽管如此,TextArea 和 IDE 终端都没有输出。当我添加 System.out.println("hello") 来测试 printStream 时,出现了 NullPointerException

我在想要么是我传递 TextArea 变量的方式有问题,要么是我在 channel.

中的函数占用的线程有问题

知道这是为什么以及如何解决吗?

我知道我的问题非常具体,我的问题可能过于宽泛,无法充分表达。

我的 objective 是从 JSch 库中的 exec 函数的输出中获取 System.err 消息并将其显示在 JavaFX TextArea 中。因此,我需要从远程服务器获取错误流,而不是本地程序的错误流。

我试图创建一个 OutputStream 来执行此操作,但它没有解决我的问题。因此,我想出了一个解决方法:

首先,我将 JSch 通道(其中我 运行 我的 exec 函数)的错误写入文件:

File file = new File("tempOut/errorLog.txt");
FileOutputStream fos = new FileOutputStream(file);
PrintStream ps = new PrintStream(fos);
System.setErr(ps);
((ChannelExec) channel).setErrStream(System.err);

然后我读取该文件并在我的 GUI 中显示其内容:

FileReader fileReader = new FileReader(file);    
BufferedReader br = new BufferedReader(fileReader);  //creates a buffering character input stream  
            
String line;
while ((line = br.readLine()) != null)
{ 
    terminalOut = textArea_terminalOut.getText();
    terminalOut = terminalOut + "\n\n" + line;
}

这基本上就是我想出的解决方法。如果有更好的方法,我将不胜感激。