Nếu các tệp bạn đang sắp xếp có thể được sửa đổi hoặc cập nhật cùng lúc thì việc sắp xếp đang được thực hiện:
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;
}
Cả hai giải pháp này đều tạo ra cấu trúc dữ liệu bản đồ tạm thời để tiết kiệm thời gian sửa đổi liên tục cuối cùng cho mỗi tệp trong thư mục. Lý do chúng tôi cần làm điều này là nếu các tệp của bạn đang được cập nhật hoặc sửa đổi trong khi sắp xếp của bạn đang được thực hiện thì bộ so sánh của bạn sẽ vi phạm yêu cầu về tính chuyển đổi của hợp đồng chung của giao diện so sánh vì thời gian sửa đổi cuối cùng có thể thay đổi trong quá trình so sánh.
Mặt khác, nếu bạn biết rằng các tệp sẽ không được cập nhật hoặc sửa đổi trong quá trình sắp xếp của bạn, bạn có thể thoát khỏi khá nhiều câu trả lời khác được gửi cho câu hỏi này, trong đó tôi là một phần:
Java 8+ (Không sửa đổi đồng thời trong khi sắp xếp)
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());
}
}
Lưu ý: Tôi biết bạn có thể tránh việc dịch sang và từ các đối tượng Tệp trong ví dụ trên bằng cách sử dụng Tệp :: getLastModifiedTime api trong hoạt động luồng được sắp xếp, tuy nhiên, sau đó bạn cần xử lý các ngoại lệ IO đã kiểm tra bên trong lambda của mình. . Tôi muốn nói rằng hiệu suất đủ quan trọng đến mức bản dịch không được chấp nhận thì tôi sẽ xử lý IOException đã kiểm tra trong lambda bằng cách tuyên truyền nó dưới dạng UncheckedIOException hoặc tôi sẽ từ bỏ các tệp api hoàn toàn và chỉ xử lý các đối tượng Tệp:
final List<File> sorted = Arrays.asList(new File(directoryPathString).listFiles());
sorted.sort(Comparator.comparing(File::lastModified));