有没有一种简单的方法可以从无缓冲的子进程中读取输出?我正在尝试从 Java 调用 C 程序,但显然它在连接到管道时是 stdout 块缓冲的,并且仅在连接到控制台时是行缓冲的。我无法修改 C 程序。
也许有一种方法可以让程序误以为它已连接到控制台?也适用于 linux 的解决方案的奖励积分。
这不是一个很好的解决方案,但运行时库可能不会缓冲串行端口,因此如果您足够绝望,您可以使用空调制解调器仿真器,例如com0com或其衍生产品。
您是否尝试过使用环境变量 BUF_1_=0?
您可以将 c 输出重定向到一个文件,然后使用 java 从另一个线程中拖尾文件
org.apache.commons.io.input.Tailer
好的 -
1) “行缓冲输入”是控制台模式程序的常用习语,可追溯到最初的 Unix 和串行模式 VTxx 终端。
2)您可以读取“原始的、无缓冲的”I/O(一次击键,而不是一次一行),但细节是特定于操作系统的。无论您需要在特定操作系统上做什么,几乎都可以通过 Java 完成。
3)听起来您希望能够在 Windows 键盘上截获“向上箭头”键或“向下翻页”键。也许是为了玩游戏,或者是为了与控制台模式的用户界面交互。
4) 有几种选择。您可能希望考虑的是用于测试的“机器人”API:
如果这还不够,请详细说明您究竟是如何尝试让 Java 程序与 C 程序交互的(并说明该平台是否确实是 Windows 和 DOS 提示符)。
最好的方法是使用线程来读取输出
我要做的是:使用 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;
}