【问题标题】:java ProcessBuilder: run program with multiple inputjava ProcessBuilder:运行具有多个输入的程序
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多