我使用ProcessBuilder从java运行系统命令。系统命令可以询问用户的输入数据。当系统命令多次向用户请求输入数据时,程序失败。直接从命令行运行此类命令的示例:
>test-input
Continue? Y/N
y
Entered y
Again: Continue? Y/N
y
Entered y
如果我使用基于ProcessBuilder的程序来运行“test-input”,它会挂起或无法再次输入。这是读/写逻辑的代码。从输入流中读取(省略异常处理和流关闭逻辑)
ProcessBuilder pb = new ProcessBuilder(cmdList);
pb.redirectErrorStream(true);
pb.directory(new File("some-test-dir"));
process = pb.start();
InputStream is = process.getInputStream();
int value = -1;
while ( (value = is.read()) != -1) {
reader.append((char)value);
}
int result = process.waitFor();
写入输出流:
public void write(String s) {
OutputStream os = null;
try {
os = process.getOutputStream();
os.write(s.getBytes(Charset.forName("UTF-8")));
}
catch (IOException e) {
//...
}
finally {
// Problematic
os.close();
}
}
问题发生在os.close()行。如果我把它放在那里,输出流在第一个输入数据处理后关闭,因此无法重新打开,程序无法获取第二个输入数据。如果我不关闭输出流,那么程序就会挂起,因为is.read()会永远被阻塞。如何解决这个问题?感谢
答案 0 :(得分:0)
通过为每个输入写一个换行符来解决问题,如:Writing to InputStream of a Java Process
中所述os.write(s.getBytes(Charset.forName("UTF-8")));
os.write('\n');
os.flush();