我有一个将 WAV 顺序转换为 MP3 的批处理过程。问题是在几千个文件之后打开的文件太多,并且超出了文件限制。
它这样做的原因是因为 SystemCommandTasklet 中的代码:
FutureTask<Integer> systemCommandTask = new FutureTask<Integer>(new Callable<Integer>() {
public Integer call() throws Exception {
Process process = Runtime.getRuntime().exec(command, environmentParams, workingDirectory);
return process.waitFor();
}
});
这有一个令人讨厌的副作用,就是让我依赖 JVM 来清理进程,让文件保持打开状态等等。
我把它改写成这样:
FutureTask<Integer> systemCommandTask = new FutureTask<Integer>(new Callable<Integer>() {
public Integer call() throws Exception {
Process process = Runtime.getRuntime().exec(command, environmentParams, workingDirectory);
int status = process.waitFor();
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().flush();
process.getOutputStream().close();
process.destroy();
return status;
}
});
我有 95% 的把握这在我的 mac 上有效(感谢 lsof),但是我如何进行适当的测试以在任何系统上工作以证明我正在尝试做的事情确实有效?