通过ProcessBuilder(阻塞)交互式shell

时间:2019-06-16 22:44:23

标签: java processbuilder interactive-shell

我构建了一个交互式EXE,这意味着您可以连续向其发送新命令,它将对其进行处理。

可以根据this的答案在Java中实现此操作的自动化。但是,在发送命令时,代码将不会等到命令完成。相反,它将立即将控件返回给调用方,这可能会导致race conditions:如果发送的命令应该写入文件,则可能在访问文件之前尚未创建文件。如何发送命令,读取输出,并且一旦再次期望输入命令,sendCommand()调用就会返回?

public synchronized void sendCommand(String command) throws IOException
{
    byte[] commandBytes = (command + "\n").getBytes(UTF_8.name());
    outputStream.write(commandBytes);
    outputStream.flush();
}

最好同时也返回过程输出。这将是非交互式shell命令的默认行为,该命令一旦完成执行便会终止。 read()无限期阻塞,直到进程终止,并且我不想硬编码预期的进程输出或类似的hacks的长度来规避此缺点。

1 个答案:

答案 0 :(得分:0)

我决定重新编写二进制文件以使其不再是交互式的。事实证明,预期的性能提升是微不足道的,因此没有更多的理由保持它的交互性并增加实施麻烦。