Windows上无缓冲的子进程标准输出

时间:2012-09-21 15:58:23

标签: java c windows

是否有一种简单的方法可以从子进程中读取未缓冲的输出?我正在尝试从Java调用一个C程序,但显然当连接到管道时它是stdout块缓冲,只有在连接到控制台时才进行行缓冲。我无法修改C程序。

也许有办法让程序误以为它连接到控制台?对于适用于Linux的解决方案的奖励积分。

5 个答案:

答案 0 :(得分:1)

这不是一个很好的解决方案,但运行时库可能不会缓冲串行端口,所以如果你非常绝望,你可以使用零{调制解调器仿真器,如com0com或其衍生物。

答案 1 :(得分:0)

您是否尝试过使用环境变量BUF_1_ = 0?

答案 2 :(得分:-1)

好的 -

1)“行缓冲输入”是控制台模式程序的常用习惯用法,可以追溯到最初的Unix和串行模式VTxx终端。

2)您可以读取“原始的,无缓冲的”I / O(一次一键击,而不是一次一行),但细节是特定于操作系统的。无论你需要在特定操作系统上做什么,你几乎可以肯定可以从Java做起。

3)听起来你希望能够在Windows键盘上拦截“向上箭头”键或“向下翻页”键。也许是为了玩游戏,或者是为了与控制台模式的用户界面进行交互。

4)有几种选择。您可能希望考虑的是用于测试的“机器人”API:

如果这还不够,请详细说明您如何尝试让Java程序与C程序交互(并澄清该平台是否确实是Windows和DOS提示符。)

答案 3 :(得分:-1)

您可以将c输出重定向到文件,然后使用

从java中的另一个线程中拖尾文件
org.apache.commons.io.input.Tailer

答案 4 :(得分:-1)

最好的方法是使用Threads来读取输出

我要做的是:使用Callable(一个Runnable也可以),我从进程输入(process.getInputStream())和我想要存储输出的输出。对StdErr也应如此。可以使用您喜欢的任何方式读取结果输出。

 public Object call () throws IOException {
        int bytesRead;
        byte[] b = new byte [ this.maxBlockSize ];

        try {
            while ( ( bytesRead = this.input.read ( b ) ) != -1 ) {
                this.output.write ( b, 0, bytesRead );
            }
        } finally {
            if ( this.output != null ) {
                this.output.close ();
            }
        }
        return null;
    }