获取按上次修改排序的目录中的文件?
在带有新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 MinMaxPriorityQueue和FileComparator所必需的:
com.google.guava guava 18.0 commons-io commons-io 2.4
您还可以找到Files.newDirectoryStream的filter参数:
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)