如何将输出从 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;
}
这基本上就是我想出的解决方法。如果有更好的方法,我将不胜感激。
我正在尝试创建一个简单的应用程序,允许我在我的应用程序中将所有 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;
}
这基本上就是我想出的解决方法。如果有更好的方法,我将不胜感激。