【发布时间】:2020-06-25 13:22:34
【问题描述】:
我有一个获取文件夹文件的方法。我只读取文件的文件名。在我的程序结束时,我删除了该文件。问题是有时会出现“打开的文件太多”错误。 我发现删除的文件仍然打开。
这是我的代码:
获取文件
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 "$0"`
SCRIPT_DIR=$(pwd)
RESULT_TXT=${SCRIPT_DIR}/${ME}_result.txt
PID_FILE=${SCRIPT_DIR}/${ME}_${SCRIPT_PID}.pid
echo $$ > $PID_FILE
【问题讨论】:
-
您仍然可以通过
FileInputStream、FileOutputStream或某个渠道或其他方式打开文件。关闭那个。在 unix 上“删除”文件只会取消其名称的链接。如果一个文件没有留下任何名称并且没有被任何进程打开那么它实际上将被完全删除。 -
我已经检查过了,但我的代码中没有 FileInputStream、FileOutputStream 或其他流。很奇怪吧?
-
为了打开文件,必须有东西打开它。删除文件不会打开它。因此,它发生在您没有向我们展示的代码中。如果我们的提示没有帮助,您需要写一个minimal reproducible example,以便我们弄清楚您实际在做什么,以及实际出了什么问题。
-
@acer23:然后通过此处返回的
File对象向我们展示您做什么。 有什么东西一定在打开它。 -
@JoachimSauer 我只使用文件来获取文件名。