我继承了一些代码:
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
一堆我的意思是在10万千万的领域
我得到waitFor调用是为了阻止这些发生等待进程完成并退出,但是我认为chmod在文件实际关闭之前返回一个结果.有人知道这是否会成为这些例外的原因?
我的另一个倾向是,数千个文件的打开和关闭在java端没有足够快的发生,还有其他的事情,也许有些形式的文件缓冲区没有被清除,正在调用fw.close().
我对java很新,这是一个让我失望的怪异怪物. (很高兴应用程序仍然运行某种方式..在吐出一个非常大的日志文件后)
解决方法
我假设你正在一个循环中运行这些chmod命令 – 否则我不明白为什么你会得到这么多异常.您可能会遇到死锁,因为您没有读取生成的进程的输出.这当然是用来在我们之前的ProcessBuilder Runtime.exec()日子里咬我的.
将您的代码段更改为上述模式:
try { ProcessBuilder pb = new ProcessBuilder("/bin/chmod",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),看看是否有助于这种情况.