窗口上未缓冲的子进程stdout



有没有一种简单的方法可以读取未缓冲的子流程的输出?我试图从Java调用一个C程序,但很明显,当连接到管道时,它是stdout块缓冲的,只有当连接到控制台时才是行缓冲的。我不能修改C程序。

也许有一种方法可以欺骗程序,让它认为它连接到了控制台?在linux上运行的解决方案也可以获得额外积分。

这不是一个很好的解决方案,但运行库可能不缓冲串行端口,所以如果你足够绝望,你可以使用空调制解调器模拟器,如com0com或其衍生物。

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

OK-

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

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

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

4) 有几种选择。一个你可能想考虑的是"机器人"API,用于测试:

  • http://www.java-tips.org/java-se-tips/java.awt/how-to-use-robot-class-in-java.html

如果这还不够,请提供更多关于如何让Java程序与C程序交互的详细信息(并澄清该平台是否确实是Windows和DOS提示符)。

您可以将c输出重定向到一个文件,然后使用从java中的另一个线程跟踪该文件

org.apache.commons.io.input.Tailer

最好的方法是使用线程读取输出

我要做的是:使用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;
}

最新更新