Si les fichiers que vous triez peuvent être modifiés ou mis à jour en même temps que le tri est effectué:
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;
}
Ces deux solutions créent une structure de données de carte temporaire pour économiser une heure de dernière modification constante pour chaque fichier du répertoire. La raison pour laquelle nous devons le faire est que si vos fichiers sont mis à jour ou modifiés pendant que votre tri est effectué, votre comparateur violera l'exigence de transitivité du contrat général de l'interface du comparateur car les dernières heures modifiées peuvent changer pendant la comparaison.
Si, d'autre part, vous savez que les fichiers ne seront pas mis à jour ou modifiés pendant votre tri, vous pouvez vous en tirer avec à peu près n'importe quelle autre réponse soumise à cette question, dont je suis partielle:
Java 8+ (pas de modifications simultanées pendant le tri)
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());
}
}
Remarque: Je sais que vous pouvez éviter la traduction vers et depuis les objets File dans l'exemple ci-dessus en utilisant l' API Files :: getLastModifiedTime dans l'opération de flux trié, cependant, vous devez alors traiter les exceptions d'E / S vérifiées dans votre lambda, ce qui est toujours un problème . Je dirais que si les performances sont suffisamment critiques pour que la traduction soit inacceptable, je traiterais soit l'exception IOException vérifiée dans la lambda en la propageant comme une exception UncheckedIOException, soit je renoncerais complètement à l'API Files et ne traiterais qu'avec les objets File:
final List<File> sorted = Arrays.asList(new File(directoryPathString).listFiles());
sorted.sort(Comparator.comparing(File::lastModified));