我发现一个Java进程抛出此错误:
Caused by: java.net.SocketException: Too many open files
我知道可以通过增加Unix中打开文件的限制来纠正此问题,但是,我想找出为什么Java进程没有首先关闭文件的原因。
我检查了源代码,发现下面的代码段用于从文件中读取数据。
String content = new Scanner(new File("../../example/test.txt"), "UTF-8").useDelimiter("\\A").next();
我认为这是问题所在,因为阅读后扫描仪没有关闭?这可能是问题吗?还是因为没有创建扫描仪对象,所以不需要将其关闭?
我认为这是问题所在,因为阅读后扫描仪没有关闭?
这很可能是罪魁祸首。如果AScanner
可用于垃圾回收,则可以隐式关闭A。但是,由于无法预测垃圾收集器何时运行,因此您永远不要依赖于此。相反,Scanner
完成操作后应明确关闭。这意味着您应该遵循以下模式:
Scanner scan = null;
try {
scan = new Scanner(file);
String token = scan.next();
// do something with token
} catch (Exception ex) {
// print out error message
} finally
scan.close();
}
当然,根据您的确切需求,这可能是通过声明throws子句简单地传播异常的方法。主要思想是,无论是否引发异常,您都需要在某处需要一个finally子句以确保将其Scanner
关闭。
请注意,Java 7引入了“尝试资源”,这使我们更轻松地处理这种情况。如果您使用的是Java 7,建议您对此进行研究。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句