On CI会简单地创建一些管道并使用dup2来覆盖std文件描述符,而另一端我会在无限循环上为每个输出管道(sdtout,sdterr)创建一个线程,利用阻止管道IO更新textArea / canvas适合控制台的建议。至于stdin,我会监听这些组件上的关键事件,将它们写入管道。
但是如何在swing上使用Java执行该操作呢?
我不能将本机代码混合为项目指令。到目前为止,我已经打破了许多项目指令,所以我无法推动......
提供某种级别的终端仿真也很酷,例如VT100,但是如何通知unix我会设置TERM envvar。如何通知unix这样的功能。
在C上我会做以下事情:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
static pthread_t workers[2];
static void *_worker(void *file)
{
int c;
if(!file) pthread_exit(NULL);
while((c=fgetc(file))!=EOF) {
// Sync and put C on the screen
}
pthread_exit(NULL);
}
int initConsole()
{
int stdin_pipe[2], stdout_pipe[2], stderr_pipe[2];
if(!(pipe(stdin_pipe)||pipe(stdout_pipe)||pipe(stderr_pipe))) {
if(dup2(stdin_pipe[0], STDIN_FILENO)<0) return -1;
if(dup2(stdout_pipe[1], STDOUT_FILENO)<0) return -1;
if(dup2(stderr_pipe[1], STDERR_FILENO)<0) return -1;
pthread_create(&workers[0], NULL, _worker, fdopen(stdout_pipe[0], "r"));
pthread_create(&workers[1], NULL, _worker, fdopen(stderr_pipe[0], "r"));
// Register a handler within the toolkit to push chars into the stdin_pipe
return 0;
}
return -1;
}
答案 0 :(得分:1)
我在第1次误解了你的问题,所以如果你需要在线程中读取System.in并使用EventQueue.invokeLater()附加到文本区域。
答案 1 :(得分:1)
您可以通过继承PrintStream并让您的类简单地写入JTextArea来将System.out定向到JTextArea。然后简单地创建一个类的实例并调用System.setOut(yourInstance)
;
你可以通过继承InputStream并通过从JTextArea返回数据来实现read()
方法,与System.in做类似的事情。