gpt4 book ai didi

Linux 上的 Java 无法读取进程输入流

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:01 25 4
gpt4 key购买 nike

我在 Java 中使用 ProcessBuilder 生成一个进程并尝试读取它的输出:

public static void main(String... args) throws IOException, InterruptedException {

ProcessBuilder builder = new ProcessBuilder("test.exe");
Process process = builder.start();

InputStream stdout = process.getInputStream();
final BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
final List<String> queue = new ArrayList<String>();

Thread ioThread = new Thread() {
public void run() {
System.out.println("STARTED THREAD");
String line = null;
try {
while ((line = reader.readLine()) != null) {
System.out.println("ADD: " + line);
queue.add(line);
Thread.yield();
}
} catch (IOException exception) {
System.err.println("Fatal Error: " + exception.getMessage());
}
}
};
ioThread.start();

Thread.sleep(10000);
System.out.println("GOT: " + queue);
}

这在我的 Windows 机器和本地 Linux 安装上都运行良好。

在我的 Linux VM(DigitalOcean 和 Linode)上,它不起作用,但是,这意味着进程开始了,但是正在运行的线程无法向队列中添加一行(在主程序中等待十秒后,队列为空,而在 Windows 中,队列包含读取的行)。

到目前为止我已经尝试过:

  • 将错误流重定向到输出流(即使我确定测试程序正在 STDOUT 上输出行
  • 将 stdbuf 与 -oL 和 -eL 一起使用...不起作用
  • 尝试手动逐字节读取而不是使用 BufferedReader,同样的问题
  • 将线程转换为 FutureTask
  • 在 OpenJDK 和 Oracle VM 之间切换

它绝对适用于 Windows 和某些 Linux 机器。

最佳答案

毕竟这是一个缓冲问题:在这种情况下,一个 stdbuf 无法修复。

使用带有 script 的伪终端可以解决问题,但是,使用:

ProcessBuilder builder = new ProcessBuilder();
builder.command().add("script");
builder.command().add("-c");
builder.command().add(command);
builder.command().add("-f");
builder.command().add("-q");

关于Linux 上的 Java 无法读取进程输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32781225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com