繁体   English   中英

如何使用Java在目录中获取最旧的文件

[英]How to get oldest file in a directory using Java

有没有使用java获取目录中最旧文件的方法? 我有一个目录,我写日志文件,并希望在我记录超过500个日志文件后删除日志文件(但只想删除最旧的日志文件)。

我能想象自己的唯一方法是:

  • 使用File.listFiles()方法获取文件列表
  • 循环遍历每个文件
  • 使用File.lastModified()存储上次修改日期,并与循环迭代中的File进行比较,保留最旧的lastModified()

这个逻辑的不方便之处在于,每次我想获取最旧的文件时,我都必须循环日志目录,这似乎不是最有效的。

我希望java.io.File库有一个方法来获取目录中最旧的文件,但它似乎不存在,或者我还没有找到它。 如果有一种方法可以获取目录中最旧的文件或者更方便的方法来编写解决方案,我很想知道。

谢谢

不幸的是,你将不得不走完文件系统。 就像是:

public static void main(String[] args) throws IOException {
    String parentFolder = "/var/log";
    int numberOfOldestFilesToFind = 5;

    List<Path> oldestFiles = findOldestFiles(parentFolder, numberOfOldestFilesToFind);

    System.out.println(oldestFiles);
}

private static List<Path> findOldestFiles(String parentFolder, int numberOfOldestFilesToFind) throws IOException {
    Comparator<? super Path> lastModifiedComparator = 
            (p1, p2) -> Long.compare(p1.toFile().lastModified(),
                                     p2.toFile().lastModified());

    List<Path> oldestFiles = Collections.emptyList();

    try (Stream<Path> paths = Files.walk(Paths.get(parentFolder))) {
        oldestFiles = paths.filter(Files::isRegularFile)
                           .sorted(lastModifiedComparator)
                           .limit(numberOfOldestFilesToFind)
                           .collect(Collectors.toList());
    }

    return oldestFiles;
}

基于@Yoda评论,我想我会回答我自己的问题。

public static void main(String[] args) throws IOException {
    File directory = new File("/logFiles");
    purgeLogFiles(directory);
}

public void purgeLogFiles(File logDir){
    File[] logFiles = logDir.listFiles();
    long oldestDate = Long.MAX_VALUE;
    File oldestFile = null;
    if( logFiles != null && logFiles.length >499){
        //delete oldest files after theres more than 500 log files
        for(File f: logFiles){
            if(f.lastModified() < oldestDate){
                oldestDate = f.lastModified();
                oldestFile = f;
            }               
        }

        if(oldestFile != null){
            oldestFile.delete();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM