【发布时间】:2017-02-05 14:56:54
【问题描述】:
我正在使用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'作为答案,它导致进程等待输入。我更改了代码,因此我将展示将输入插入到子流程输出流的正确方法。
【问题讨论】:
标签: java bufferedreader processbuilder