首页 > 解决方案 > 错误=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

标签: javalinuxpid

解决方案


上面的代码使文件/文件夹在 linux 中保持打开状态。所以我使用DirectoryStreamand try-resourcesblock 来实现对已使用资源的自动关闭。

    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();
                }
            }

推荐阅读