在Windows上无缓冲的subprocess标准输出

有没有一种简单的方法来读取缓冲subprocess的输出? 我试图从Java调用一个C程序,但是显然当连接到pipe道时,它是标准输出块缓冲,只有在连接到控制台时才进行线路缓冲。 我不能修改C程序。

也许有一种方法来愚弄程序认为它连接到控制台? 也可以在Linux上运行的解决scheme的奖励点。

Solutions Collecting From Web of "在Windows上无缓冲的subprocess标准输出"

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

你有没有尝试过使用环境变量BUF_1_ = 0?

好 –

1)“线路缓冲输入”是控制台模式程序的一个常见方式,可追溯到原始的Unix和串行模式的VTxx终端。

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

3)这听起来像你想要能够在Windows键盘上拦截“向上箭头”键或“向下翻页”键。 或许用于玩游戏,或用于与控制台模式用户界面交互。

4)有几个选项。 你可能想要考虑的是“机器人”API,用于测试:

如果这还不够,请详细说明如何让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; }