获取按上次修改排序的目录中的文件?

在带有新I / O API的Java 7中,是否有一种简单的方法可以按上次修改日期列出目录的内容? 基本上我只需要获取最长时间未修改的文件(按最后修改的升序排序,取第一个文件名)。

没有真正的“简单方法”,但它有可能:

List files = new ArrayList<>(); try(DirectoryStream stream = Files.newDirectoryStream(dir)) { for(Path p : stream) { files.add(p); } } Collections.sort(files, new Comparator() { public int compare(Path o1, Path o2) { try { return Files.getLastModifiedTime(o1).compareTo(Files.getLastModifiedTime(o2)); } catch (IOException e) { // handle exception } } }); 

这将最后修改文件最快的修改文件。 DirectoryStream不会遍历子目录。

杰弗里答案的略微“流”变化,有些人可能会觉得更容易。 发布完整性。

 try (DirectoryStream files = Files.newDirectoryStream(path)) { StreamSupport.stream(files.spliterator(), false) .sorted((o1, o2) -> { try { return Files.getLastModifiedTime(o1).compareTo(Files.getLastModifiedTime(o2)); } catch (IOException ex) { ... } }) .filter(file -> Files.isRegularFile(file)) .forEach(file -> { }); } 

在目录的File对象上使用listFiles()。 将数组转换为arraylist。 然后使用在Collections类上使用静态排序方法对它们进行排序,并使用自定义Comparator在文件上使用getTotalSpace()方法。 编辑:使用lastModified而不是getTotalSpace。

 lastModified() 

返回上次修改此抽象路径名表示的文件的时间。

Java 7 – IO API

你可以使用http://docs.oracle.com/javase/1.5.0/docs/api/java/io/File.html#listFiles(java.io.FileFilter )并提供http://docs.oracle.com /javase/1.5.0/docs/api/java/io/FileFilter.html

然后比较http://docs.oracle.com/javase/1.5.0/docs/api/java/io/File.html#lastModified ()并完成

如果你关心性能 – 那么只需从文件列表中选择一个具有最大/最小值的,这将给你O(n)复杂性

注意:此解决方案需要Guava。

Java IO / NIO API提供对目录列表的低级访问 ,但是没有完成处理,而是由调用者完成。 新的J ava7 NIO DirectoryStream在访问目录列表时具有最小的占用空间,以便进一步处理,例如排序。

这是我的解决方案 :从DirectoryStream中读取文件,并从流中构建一个具有(可选)有限大小的排序队列。 返回队列中最旧/最新的元素。

 private void listFilesOldestFirst(final File directory, final Integer maxNumberOfFiles) { final Builder builder = MinMaxPriorityQueue .orderedBy(LastModifiedFileComparator.LASTMODIFIED_COMPARATOR); if( maxNumberOfFiles != null ) { builder.maximumSize(maxNumberOfFiles); } // queue with constant space, if maxNumberOfFiles is set, otherwise behaves like an unbound queue with an O(log n) penalty for insertion final MinMaxPriorityQueue oldestFiles = builder.create(); try(DirectoryStream stream = Files.newDirectoryStream(directory.toPath())) { for(final Path p : stream) { oldestFiles.add(p.toFile()); } } catch (final IOException e) { throw new RuntimeException(e); } final File[] fileArray = oldestFiles.toArray(new File[]{}); Arrays.sort(fileArray, oldestFiles.comparator()); // ... use fileArray final ArrayList arrayList = Lists.newArrayList(oldestFiles); Collections.sort(arrayList, oldestFiles.comparator()); // ... use arrayList } 

这些依赖关系是Guava MinMaxPriorityQueueFileComparator所必需的:

   com.google.guava guava 18.0   commons-io commons-io 2.4  

您还可以找到Files.newDirectoryStreamfilter参数:

  final Filter sampleFilter = new Filter() { @Override public boolean accept(final Path entry) throws IOException { return true; // see commons-io -> FileFilterUtils } }; ... Files.newDirectoryStream(directory.toPath(), sampleFilter)