error=24,打开的文件太多。删除的文件仍然打开
error=24, Too many open files. Deleted files are still open
我有一个获取文件夹文件的方法。我只读了文件的文件名。在我的程序结束时,我删除了文件。问题是有时会出现“打开的文件太多”错误。
我发现删除的文件仍然打开。
这是我的代码:
正在获取文件
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.
上运行
----- 更新
.pid 文件由脚本创建
#!/bin/bash
SCRIPT_PID=`echo $$`
ME=`basename "[=12=]"`
SCRIPT_DIR=$(pwd)
RESULT_TXT=${SCRIPT_DIR}/${ME}_result.txt
PID_FILE=${SCRIPT_DIR}/${ME}_${SCRIPT_PID}.pid
echo $$ > $PID_FILE
以上代码使 file/folder 在 linux 中保持打开状态。所以我使用 DirectoryStream
和 try-resources
块来实现对已用资源的自动关闭。
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();
}
}
我有一个获取文件夹文件的方法。我只读了文件的文件名。在我的程序结束时,我删除了文件。问题是有时会出现“打开的文件太多”错误。
我发现删除的文件仍然打开。
这是我的代码:
正在获取文件
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.
上运行----- 更新 .pid 文件由脚本创建
#!/bin/bash
SCRIPT_PID=`echo $$`
ME=`basename "[=12=]"`
SCRIPT_DIR=$(pwd)
RESULT_TXT=${SCRIPT_DIR}/${ME}_result.txt
PID_FILE=${SCRIPT_DIR}/${ME}_${SCRIPT_PID}.pid
echo $$ > $PID_FILE
以上代码使 file/folder 在 linux 中保持打开状态。所以我使用 DirectoryStream
和 try-resources
块来实现对已用资源的自动关闭。
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();
}
}