【问题标题】:How do I find the last modified file in a directory in Java?如何在 Java 的目录中找到最后修改的文件?
【发布时间】:2025-02-06 10:50:02
【问题描述】:

如何在java的目录中找到最后修改的文件?

【问题讨论】:

  • 你问如何按上次修改时间排序?或者你想要一个找到最大最后修改时间的算法?这些似乎是显而易见的解决方案;你到底想要什么?

标签: java file-io last-modified


【解决方案1】:
private File getLatestFilefromDir(String dirPath){
    File dir = new File(dirPath);
    File[] files = dir.listFiles();
    if (files == null || files.length == 0) {
        return null;
    }

    File lastModifiedFile = files[0];
    for (int i = 1; i < files.length; i++) {
       if (lastModifiedFile.lastModified() < files[i].lastModified()) {
           lastModifiedFile = files[i];
       }
    }
    return lastModifiedFile;
}

【讨论】:

  • 我认为使用自定义比较器会更干净,但这种方式更快。
  • 使用比较器是一种很好的做法,但这只是一项简单的任务,可以不用它。
  • 没有。 long 值越大,文件修改越晚。如果这是投反对票的原因,请随时撤消它;)
  • @Bozho - 使用比较器不是“好习惯”,而不是使用 int 类型是“好习惯”。您可以说的最强的是,比较器是许多编程问题的良好(部分)解决方案。
  • 如果目录为空,您可能会获得超出范围的索引。您不应该在循环之外将 files[0] 分配给 lastModifiedFile。
【解决方案2】:

将这两者结合起来:

  1. 您可以使用File.lastModified() 获取文件的最后修改时间。
  2. 要列出目录中的所有文件,请使用File.listFiles()

请注意,在 Java 中,java.io.File 对象同时用于目录和文件。

【讨论】:

    【解决方案3】:
    import org.apache.commons.io.comparator.LastModifiedFileComparator;
    import org.apache.commons.io.filefilter.WildcardFileFilter;
    
    ...
    ...
    
    /* Get the newest file for a specific extension */
    public File getTheNewestFile(String filePath, String ext) {
        File theNewestFile = null;
        File dir = new File(filePath);
        FileFilter fileFilter = new WildcardFileFilter("*." + ext);
        File[] files = dir.listFiles(fileFilter);
    
        if (files.length > 0) {
            /** The newest file comes first **/
            Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
            theNewestFile = files[0]
        }
    
        return theNewestFile;
    }
    

    这对我很有用

    【讨论】:

      【解决方案4】:

      您可以使用 File.lastModified() 方法检索上次修改的时间。我建议的解决方案是实现一个按 lastModified() 顺序排序的自定义比较器,并将目录中的所有文件插入到使用此比较器排序的 TreeSet 中。

      未经测试的示例:

      SortedSet<File> modificationOrder = new TreeSet<File>(new Comparator<File>() {
          public int compare(File a, File b) {
              return (int) (a.lastModified() - b.lastModified());
          }
      });
      
      for (File file : myDir.listFiles()) {
          modificationOrder.add(file);
      }
      
      File last = modificationOrder.last();
      

      如果您只需要最后一个文件,Bozho 建议的解决方案可能会更快。另一方面,如果您需要做一些更复杂的事情,这可能会很有用。

      【讨论】:

        【解决方案5】:

        您的问题类似于:How to get only 10 last modified files from directory using Java?

        只需将过滤器代码更改为只有一个文件,并且接受方法应该简单地比较两个时间戳。

        未经测试的代码:

             class TopFileFilter implements FileFilter {
        
                File topFile;
        
                public boolean accept(File newF) {
                    if(topFile == null)
                        topFile = newF;
                    else if(newF.lastModified()>topFile.lastModified())
                        topFile = newF;
                    return false;
                }
        
            }
        

        现在,使用此过滤器的实例作为参数调用 dir.listFiles。最后,filter.topFile 是最后修改的文件。

        【讨论】:

          【解决方案6】:

          假设变量thePath包含我们要搜索的目录,下面的sn -p返回里面最后修改的文件:

          Files.walk(thePath)
          .sorted((f1, f2) -> -(int)(f1.toFile().lastModified() - f2.toFile().lastModified()))
          .skip(1)
          .findFirst()
          

          它的作用是:

          • 首先将文件按最后修改时间倒序排列,
          • 然后跳过目录本身,
          • 最后取流中的第一个元素(这是最后修改的元素)。

          【讨论】:

          • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
          【解决方案7】:

          Emil 解决方案中的比较器这样会更干净

          public int compare(File a, File b) {
              if ((a.lastModified() < b.lastModified())) {
                  return 1;
              } else if ((a.lastModified() > b.lastModified())) {
                  return -1;
              } 
              return 0;
          }
          

          (a.lastModified() - b.lastModified()) 转换为int 可能会产生意想不到的结果。

          【讨论】:

            【解决方案8】:
                String path = "C:\\Work\\Input\\";
            
                File dir = new File(path);
                File[] files = dir.listFiles();
            
                Arrays.sort(files, new Comparator<File>() {
                    public int compare(File f1, File f2) {
                        return Long.valueOf(f2.lastModified()).compareTo(
                                f1.lastModified());
                    }
                });
            
                for (int index = 0; index < files.length; index++) {
                    // Print out the name of files in the directory
                    System.out.println(files[index].getName());
                }
            
            }
            

            【讨论】:

              【解决方案9】:

              Java 8

              Optional<Path> findLastModifiedFile(Path directory) throws IOException {
                  return Files.list(directory)
                          .max(this::compareLastModified);
              }
              
              int compareLastModified(Path p1, Path p2) {
                  try {
                      return Files.getLastModifiedTime(p1).compareTo(Files.getLastModifiedTime(p2));
                  } catch (IOException e) {
                      throw new RuntimeException(e);
                  }
              }
              

              【讨论】:

                最近更新 更多