10

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

也许有一种方法可以让程序误以为它已连接到控制台?也适用于 linux 的解决方案的奖励积分。

4

5 回答 5

1

这不是一个很好的解决方案,但运行时库可能不会缓冲串行端口,因此如果您足够绝望,您可以使用空调制解调器仿真器,例如com0com或其衍生产品。

于 2012-12-04T23:39:40.783 回答
0

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

于 2012-10-31T16:04:22.127 回答
-1

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

org.apache.commons.io.input.Tailer
于 2012-10-13T07:26:14.800 回答
-1

好的 -

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

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

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

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

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

于 2012-09-21T20:29:26.057 回答
-1

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

我要做的是:使用 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;
    }
于 2012-12-03T17:09:23.617 回答