Java 一般使用 Runtime .getRuntime(). exec () 或者 ProcessBuilder 调用外部脚本:
需要注意的是,这里 stream 的方向是相对于主程序的,所以 getInputStream() 就是子进程的输出,而 getOutputStream()
是子进程的输入。
基于同样的 Buffer 原因,假如调用了 waitFor 方法等待子进程执行完毕而没有及时处理输出的话,就会造成 死锁 。 由于 Java API 很少变动,所以没有像 Python 那样提供新的 run 方法。
但其中的思想和 Python 都是统一的,就是在后台开启新 线程 读取子进程的输出,防止 Buffer 写满。
另一个统一思想的地方就是,都推荐使用数组或 list 将输入的 shell 命令分隔成多段,这样的话就由系统来处理空格等特殊字符问题。