Sıralama yaptığınız dosyalar, sıralama yapılırken aynı anda değiştirilebilir veya güncellenebilirse:
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;
}
Bu çözümlerin her ikisi de, dizindeki her dosya için son değiştirilme zamanını sabit tutmak için geçici bir harita veri yapısı oluşturur. Bunu yapmamızın nedeni, sıralamanız yapılırken dosyalarınız güncelleniyor veya değiştiriliyorsa, karşılaştırıcı sırasında son değiştirilen zamanlar değişebileceğinden, karşılaştırıcınız karşılaştırıcı arabiriminin genel sözleşmesinin geçerlilik gereksinimini ihlal edecektir.
Öte yandan, sıralama sırasında dosyaların güncellenmeyeceğini veya değiştirilmeyeceğini biliyorsanız, kısmi olduğum bu soruya gönderilen hemen hemen tüm diğer yanıtlardan kurtulabilirsiniz:
Java 8+ (Sıralama sırasında eşzamanlı değişiklik yok)
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());
}
}
Not: Sıralı akış işleminde Files :: getLastModifiedTime api'yi kullanarak yukarıdaki örnekteki Dosya nesnelerine ve bu nesnelerden çeviriden kaçınabileceğinizi biliyorum , ancak lambda içinde her zaman bir ağrı olan kontrol edilen IO istisnalarıyla uğraşmanız gerekir. . Performansın çevirinin kabul edilemez olduğu kadar kritik olması durumunda, ya bir UncheckedIOException olarak yayılarak lambda'daki kontrol edilen IOException ile başa çıkacağımı ya da Files api'den tamamen vazgeçip sadece File nesneleriyle uğraşacağımı söyleyebilirim:
final List<File> sorted = Arrays.asList(new File(directoryPathString).listFiles());
sorted.sort(Comparator.comparing(File::lastModified));