java - 错误=24,打开的文件太多。已删除的文件仍处于打开状态
问题描述
我有一个获取文件夹文件的方法。我只读取文件的文件名。在我的程序结束时,我删除了该文件。问题是有时会出现“打开的文件太多”错误。我发现删除的文件仍然打开。
这是我的代码:
获取文件
private File getFile(String fileName,String filetype) {
File dir = new File("./");
File[] foundFiles = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.startsWith(fileName) && name.endsWith(filetype);
}
});
if(foundFiles.length!=0) {
return foundFiles[0];
}
}
...
File tempFile = this.getFile("versions.sh_",".pid");
String fileName = tempFile.getName();
int startNo = fileName.indexOf("_") + 1;
int endNo = startNo + 5;
pid = fileName.substring(startNo, endNo);
//other logic
删除文件
if (pidFile != null) {
logger.info("Deleting pidFile file = " + pidFile.toString());
Files.deleteIfExists(pidFile.toPath());
}
知道我想摆脱打开文件的代码,但我不知道我的代码的哪一部分。顺便说一句,这个程序在 linux 上运行。
----- update .pid 文件由脚本创建
#!/bin/bash
SCRIPT_PID=`echo $$`
ME=`basename "$0"`
SCRIPT_DIR=$(pwd)
RESULT_TXT=${SCRIPT_DIR}/${ME}_result.txt
PID_FILE=${SCRIPT_DIR}/${ME}_${SCRIPT_PID}.pid
echo $$ > $PID_FILE
解决方案
上面的代码使文件/文件夹在 linux 中保持打开状态。所以我使用DirectoryStream
and try-resources
block 来实现对已使用资源的自动关闭。
try (DirectoryStream<Path> paths = Files.newDirectoryStream(Paths.get(base),
path -> path.getFileName().toString().startsWith(fileName) && path.toString().endsWith(filetype))) {
paths.forEach(path -> pathList.add(path));
if (pathList.size() > 0) {
file = pathList.get(0).toFile();
}
}
推荐阅读
- sql - 运行总计的 Where 子句
- c# - 来自 MS Bot Framework 中聊天机器人的 C# HTTP Post 请求
- c# - AutoMapper 将目标对象设置为 null
- javascript - 用 JavaScript 用 HTML 标记分隔字符串
- mysql - 使用第三方 API 更新 Google Cloud SQL 中的表
- android - 构建失败并出现异常。react-native-gesture-handler:compileDebugJavaWithJavac
- excel - 如何添加一列并用值填充它
- elasticsearch - 使用 Kibana 探索 IP
- python-3.x - AttributeError:“GradientBoostingRegressor”对象没有属性“np”
- arrays - SAS 仅插入到 ARRAY(示例)数据集中的第一行