java ProcessBuilder:运行带有多个输入的程序

时间:2016-12-12 17:37:14

标签: java processbuilder

我使用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()会永远被阻塞。如何解决这个问题?感谢

1 个答案:

答案 0 :(得分:0)

通过为每个输入写一个换行符来解决问题,如:Writing to InputStream of a Java Process

中所述
os.write(s.getBytes(Charset.forName("UTF-8")));
os.write('\n');
os.flush();