我继承了一些代码:
Process p = new ProcessBuilder("/bin/chmod", "777", path).start();
p.waitFor();
基本上,将键/值对作为文件存储在磁盘上是出于一些古老且高度基于巫术的原因。我真的不想深入。
但是,我留下了一堆 IO 异常:
Exception :Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Message: Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
我的意思是在 10k 到数百万的范围内
我感觉 waitFor 调用是为了阻止这些发生,等待进程完成并退出,但是我认为 chmod 在文件实际关闭之前返回结果。有谁知道这是否会导致这些异常?
我的另一个倾向是,在 Java 端打开和关闭数以千计的文件的速度不够快,还有其他事情正在发生,也许是某种形式的文件缓冲区没有得到在调用 fw.close() 时清除。
我是 java 的新手,这是一个让我难过的奇怪的东西。 (很高兴应用程序仍然以某种方式运行......在吐出一个非常大的日志文件之后)
其他人能想出办法解决这个问题吗,清除缓冲区或将文件打开限制增加到 jvm 可以跟上自身的速度(假设这是问题所在)
最佳答案
我假设您正在循环运行这些 chmod 命令 - 否则我不明白为什么您会得到这么多异常。您可能遇到了死锁,因为您没有读取衍生进程的输出。在 ProcessBuilder
和 Runtime.exec()
出现之前的日子里,这肯定让我很反感。
将您的代码片段更改为上述模式:
try {
ProcessBuilder pb = new ProcessBuilder("/bin/chmod", "777", path);
pb.redirectErrorStream(true); // merge stdout, stderr of process
Process p = pb.start();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
String lineRead;
while ((lineRead = br.readLine()) != null) {
// swallow the line, or print it out - System.out.println(lineRead);
}
int rc = p.waitFor();
// TODO error handling for non-zero rc
}
catch (IOException e) {
e.printStackTrace(); // or log it, or otherwise handle it
}
catch (InterruptedException ie) {
ie.printStackTrace(); // or log it, or otherwise handle it
}
(信用:this site)看看这是否有助于解决问题。
关于java - Process Builder waitFor() 问题和打开文件限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1129441/