【问题标题】:error=24, Too many open files. Deleted files are still open错误=24,打开的文件太多。已删除的文件仍处于打开状态
【发布时间】: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

【问题讨论】:

  • 您仍然可以通过FileInputStreamFileOutputStream 或某个渠道或其他方式打开文件。关闭那个。在 unix 上“删除”文件只会取消其名称的链接。如果一个文件没有留下任何名称并且没有被任何进程打开那么它实际上将被完全删除。
  • 我已经检查过了,但我的代码中没有 FileInputStream、FileOutputStream 或其他流。很奇怪吧?
  • 为了打开文件,必须有东西打开它。删除文件不会打开它。因此,它发生在您没有向我们展示的代码中。如果我们的提示没有帮助,您需要写一个minimal reproducible example,以便我们弄清楚您实际在做什么,以及实际出了什么问题。
  • @acer23:然后通过此处返回的File 对象向我们展示您做什么有什么东西一定在打开它。
  • @JoachimSauer 我只使用文件来获取文件名。

标签: java linux pid


【解决方案1】:

以上代码使文件/文件夹在 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();
                }
            }

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 2015-11-30
    • 2017-01-25
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多