java – Process Builder的waitFor()问题和打开的文件限制

前端之家收集整理的这篇文章主要介绍了java – Process Builder的waitFor()问题和打开的文件限制前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我继承了一些代码
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很新,这是一个让我失望的怪异怪物. (很高兴应用程序仍然运行某种方式..在吐出一个非常大的日志文件后)

任何人都可以想办法解决这个问题,清除缓冲区或将文件的开放限制增加到jvm可以跟上自己的位置(假设是问题)

解决方法

我假设你正在一个循环中运行这些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),看看是否有助于这种情况.

猜你在找的Java相关文章