(阻止)通过 ProcessBuilder 的交互式 shell



我构建了一个交互式EXE这意味着您可以不断向其发送新命令,它将处理它们。

根据这个答案,可以在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()无限期地阻止,直到进程终止,我不想硬编码预期进程输出的长度或类似的技巧来规避这个缺点。

我决定重写我的二进制文件,使其再次成为非交互式的。事实证明,预期的性能提升可以忽略不计,因此没有更多理由保持其交互性并经历更多的实施麻烦。

最新更新