Wenn die zu sortierenden Dateien gleichzeitig mit der Sortierung geändert oder aktualisiert werden können:
Java 8+
private static List<Path> listFilesOldestFirst(final String directoryPath) throws IOException {
try (final Stream<Path> fileStream = Files.list(Paths.get(directoryPath))) {
return fileStream
.map(Path::toFile)
.collect(Collectors.toMap(Function.identity(), File::lastModified))
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
// .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) // replace the previous line with this line if you would prefer files listed newest first
.map(Map.Entry::getKey)
.map(File::toPath) // remove this line if you would rather work with a List<File> instead of List<Path>
.collect(Collectors.toList());
}
}
Java 7
private static List<File> listFilesOldestFirst(final String directoryPath) throws IOException {
final List<File> files = Arrays.asList(new File(directoryPath).listFiles());
final Map<File, Long> constantLastModifiedTimes = new HashMap<File,Long>();
for (final File f : files) {
constantLastModifiedTimes.put(f, f.lastModified());
}
Collections.sort(files, new Comparator<File>() {
@Override
public int compare(final File f1, final File f2) {
return constantLastModifiedTimes.get(f1).compareTo(constantLastModifiedTimes.get(f2));
}
});
return files;
}
Beide Lösungen erstellen eine temporäre Kartendatenstruktur, um eine konstante letzte Änderungszeit für jede Datei im Verzeichnis zu sparen. Der Grund dafür ist, dass wenn Ihre Dateien während der Sortierung aktualisiert oder geändert werden, Ihr Komparator gegen die Transitivitätsanforderungen des Generalvertrags der Komparatorschnittstelle verstößt, da sich die zuletzt geänderten Zeiten während des Vergleichs möglicherweise ändern.
Wenn Sie andererseits wissen, dass die Dateien während Ihrer Sortierung nicht aktualisiert oder geändert werden, können Sie mit so ziemlich jeder anderen Antwort auf diese Frage davonkommen, von der ich teilweise bin:
Java 8+ (Keine gleichzeitigen Änderungen während des Sortierens)
private static List<Path> listFilesOldestFirst(final String directoryPath) throws IOException {
try (final Stream<Path> fileStream = Files.list(Paths.get(directoryPath))) {
return fileStream
.map(Path::toFile)
.sorted(Comparator.comparing(File::lastModified))
.map(File::toPath) // remove this line if you would rather work with a List<File> instead of List<Path>
.collect(Collectors.toList());
}
}
Hinweis: Ich weiß, dass Sie die Übersetzung von und zu Dateiobjekten im obigen Beispiel vermeiden können, indem Sie Files :: getLastModifiedTime api in der sortierten Stream-Operation verwenden. Dann müssen Sie sich jedoch mit geprüften E / A-Ausnahmen in Ihrem Lambda befassen, was immer schmerzhaft ist . Ich würde sagen, wenn die Leistung kritisch genug ist, dass die Übersetzung nicht akzeptabel ist, würde ich entweder die überprüfte IOException im Lambda behandeln, indem ich sie als UncheckedIOException weitergebe, oder ich würde auf die Datei-API insgesamt verzichten und mich nur mit Dateiobjekten befassen:
final List<File> sorted = Arrays.asList(new File(directoryPathString).listFiles());
sorted.sort(Comparator.comparing(File::lastModified));