【发布时间】:2016-12-12 17:37:13
【问题描述】:
我使用 ProcessBuilder 从 java 运行系统命令。系统命令可能会询问用户的输入数据。系统命令多次询问用户输入数据时程序失败。直接从命令行运行此类命令的示例:
>test-input
Continue? Y/N
y
Entered y
Again: Continue? Y/N
y
Entered y
如果我使用基于 ProcessBuilder 的程序运行“测试输入”,它要么挂起,要么第二次无法输入。这是读/写逻辑的代码。从输入流中读取(省略异常处理和流关闭逻辑)
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() 会被永远阻塞。如何解决这个问题?谢谢
【问题讨论】:
-
不要一直调用 process.getOutputStream()。每个进程调用一次
new OuptutStreamWriter(process.getOutputStream())并使用它。每次写入后调用作者的flush()方法。 (不直接相关:假设一个字节是一个字符是不正确的。将进程的 InputStream 包装在 InputStreamReader 中并使用 InputStreamReader 的 read 方法。) -
感谢指出一字节一字符的关系
标签: java processbuilder