gpt4 book ai didi

java - ProcessBuilder BufferedReader read() 阻塞

转载 作者:行者123 更新时间:2023-12-02 03:03:50 27 4
gpt4 key购买 nike

我正在使用ProcessBuilder来运行我们正在使用的命令行工具。在运行过程中,该工具会询问 2 个是/否问题,因此通常我会回答“y”两次,然后每次后按 Enter 键。我的问题是,该工具在从 cmd 运行时总是完成运行,但是当我通过 java 代码运行它时,它有时会工作,有时会卡在 while ((n = op.read(buffer)) != -1)(具有相同的输入)。

这是我的代码。难道我做错了什么?我缺少什么?谢谢。

List<String> processArgs = new ArrayList<>();
processArgs.add(0, "java");
processArgs.add(1, "-jar");
processArgs.add(2, JAR_PATH);
processArgs.add(3, "-put");
processArgs.addAll(args);
try
{
// run tool with put
ProcessBuilder pb = new ProcessBuilder(processArgs);
pb.directory(new File("src\\temp"));
pb.redirectErrorStream(true);
Process p = pb.start();

// write 'y' to the tool's stdin.
String answer = "y" + System.getProperty("line.separator");
// yes to first question
p.getOutputStream().write(answer.getBytes());
p.getOutputStream().flush();

// read tool's process stdout
this.op = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringWriter sw = new StringWriter();
int n = 0;
boolean answered = false;
char[] buffer = new char[BUFFER_SIZE];
while ((n = op.read(buffer)) != -1)
{
sw.write(buffer, 0, n);
if (sw.toString().contains("second question") && !answered)
{
// yes to second question
p.getOutputStream().write(answer.getBytes());
p.getOutputStream().flush();
answered = true;
}
}

stdout = sw.toString();
exitCode = p.waitFor();
}
catch (IOException | InterruptedException e)
{
throw new ToolException("process had an exception:\n" + e.getMessage());
}

更新:我更改了代码并添加了 pb.redirectErrorStream(true),但现在该进程仍然在 op.read(buffer) 上被阻止。当我调试时,它似乎卡在了第二个问题上,即使我在输出流中写入了两次“y”。我是否错误地使用了 getOutputStream()

第二次更新:第二个问题没有得到第二个“y”作为答案,导致进程等待输入。我更改了代码,以便展示将输入插入到子进程输出流的正确方法。

最佳答案

输出和错误流被缓冲。当缓冲区填满时,程序将停止等待您读取它。但是,您只能先读取输出,因此如果错误流已满,则会出现死锁。

一种简单的解决方案是将错误重定向到输出,这样您就只有一个流可供读取。即

pb.redirectErrorStream(true);

根据文档https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html

替代方案包括;将错误写入文件,或在另一个线程中读取错误。

关于java - ProcessBuilder BufferedReader read() 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42053481/

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