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 中保持打开状态。所以我使用 DirectoryStreamtry-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();
                }
            }