如果扫描程序没有关闭,java进程会保持文件打开吗



我发现一个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();

我认为这是问题所在,因为扫描仪在阅读后没有关闭?这会是问题所在吗?或者因为没有创建扫描仪对象,所以不需要关闭它?

我认为这是问题所在,因为扫描仪在阅读后没有关闭?

这很可能是罪魁祸首。如果Scanner可用于垃圾收集,则可以隐式关闭它。但是,由于无法预测垃圾收集器何时运行,因此永远不应该依赖于此。相反,当你完成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都是关闭的。

请注意,Java7引入了"尝试使用资源",这使我们更容易管理这种情况。如果您正在使用Java7,我建议您对此进行研究。

确保所有文件资源在使用后都已关闭。不要依赖javas垃圾收集机制来实现这一点。一旦你用完了所有的资源,关闭它们是一个很好的做法。

如果在程序执行过程中发生异常,请在finally块中关闭它们,或者如果您使用的是java7及以上版本,请使用try-with-resources。

最新更新