为什么我会收到"打开文件太多"的错误?

dro*_*del 0 java groovy

我发现自己必须在我的Groovy脚本中显式调用System.gc()以防止出现如下错误.垃圾收集器为什么不为我这样做?有什么我可以做的,使它垃圾收集,以防止这些错误(也许JAVA_OPTS)?

Caught: java.util.concurrent.ExecutionException: org.codehaus.groovy.runtime.InvokerInvocationException: java.io.IOException: Cannot run program "ls": java.io.IOException: error=24, Too many open files
    at groovyx.gpars.GParsPool.runForkJoin(GParsPool.groovy:305)
    at UsageAnalyzer$_run_closure2_closure6.doCall(UsageAnalyzer.groovy:36)
    at groovyx.gpars.GParsPool$_withExistingPool_closure1.doCall(GParsPool.groovy:170)
    at groovyx.gpars.GParsPool$_withExistingPool_closure1.doCall(GParsPool.groovy)
    at groovyx.gpars.GParsPool.withExistingPool(GParsPool.groovy:169)
    at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:141)
    at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:117)
    at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:96)
    at UsageAnalyzer$_run_closure2.doCall(<removed>)
    at UsageAnalyzer.run(<removed>)
Run Code Online (Sandbox Code Playgroud)

此堆栈跟踪来自并行程序,但它也发生在顺序程序中.

win*_*n74 6

当你正在使用Groovy中,可以使用便捷的方法,例如File.withReader(),File.withWriter(),File.withInputStream(),InputStream.withStream()以确保资源得到完全关闭.这比使用Java的try .. finally习惯用法要简单得多,因为不需要显式调用close()或在try块外声明变量.

例如,从文件中读取.

File f = new File('/mumble/mumble/')
f.withReader{ r -> 
   // do stuff with reader here
}
Run Code Online (Sandbox Code Playgroud)