是否有一种简单的方法可以从子进程中读取未缓冲的输出?我正在尝试从Java调用一个C程序,但显然当连接到管道时它是stdout块缓冲,只有在连接到控制台时才进行行缓冲。我无法修改C程序。
也许有办法让程序误以为它连接到控制台?对于适用于Linux的解决方案的奖励积分。
答案 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;
}