记一次Process.waitFor阻塞的坑
需求:通过调用linux的zip命令对一批文件进行压缩。
问题描述:当批量压缩的文件过多时,出现了阻塞的现象,也就是在下面的第四行代码处会阻塞:
String command = ""; // 这里定义命令的详细内容
log.info("准备执行压缩指令:{}", command);
Process proc = Runtime.getRuntime().exec(command);
int result = proc.waitFor();// 这里有时候会阻塞
原因:当执行压缩操作时,linux的zip程序会产生输出信息,java通过将输出信息读取到一个流中方便我们获取,然而在缓冲满了之后,后续的输出内容没有办法继续接收,从而出现阻塞的情况。
解决办法:读取外部程序的输出内容,避免阻塞:
log.info("准备执行压缩指令:{}", command);
Process proc = Runtime.getRuntime().exec(command);
try (
InputStreamReader inputStreamReader = new InputStreamReader(proc.getInputStream());
BufferedReader reader = new BufferedReader(inputStreamReader)
) {
String line;
while ((line = reader.readLine()) != null) {
log.info(line);// 输出每一行的内容
}
}
int result = proc.waitFor();