如何将STDIO重定向到Java应用程序上的GUI组件?

时间:2011-01-05 15:14:46

标签: java swing stdio

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;
}

2 个答案:

答案 0 :(得分:1)

System.err / out和in应该在java中做同样的事情。你还有继承的频道[System.inheritedChanne()]

我在第1次误解了你的问题,所以如果你需要在线程中读取System.in并使用EventQueue.invokeLater()附加到文本区域。

答案 1 :(得分:1)

您可以通过继承PrintStream并让您的类简单地写入JTextArea来将System.out定向到JTextArea。然后简单地创建一个类的实例并调用System.setOut(yourInstance);

你可以通过继承InputStream并通过从JTextArea返回数据来实现read()方法,与System.in做类似的事情。