정렬중인 파일을 동시에 수정하거나 업데이트 할 수있는 경우 정렬을 수행하는 중입니다.
자바 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());
}
}
자바 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;
}
이 두 가지 솔루션 모두 디렉토리의 각 파일에 대해 마지막으로 수정 된 시간을 절약하기 위해 임시 맵 데이터 구조를 만듭니다. 이를 수행해야하는 이유는 정렬이 수행되는 동안 파일이 업데이트되거나 수정되는 경우 비교 중에 마지막 수정 시간이 변경 될 수 있기 때문에 비교기가 비교기 인터페이스의 일반 계약의 전이 요구 사항을 위반하기 때문입니다.
반면에 정렬 중에 파일이 업데이트되거나 수정되지 않는다는 것을 알고 있다면이 질문에 제출 된 다른 답변으로 거의 벗어날 수 있습니다.
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)
.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());
}
}
참고 : 정렬 된 스트림 작업에서 Files :: getLastModifiedTime api를 사용하여 위 예제에서 File 객체와의 변환을 피할 수 있다는 것을 알고 있지만 람다 내에서 확인 된 IO 예외를 처리해야합니다. . 번역이 허용 할 수 없을 정도로 성능이 중요하다면 Lambda에서 확인 된 IOException을 UncheckedIOException으로 전파하여 처리하거나 파일을 완전히 포기하고 File 객체 만 처리합니다.
final List<File> sorted = Arrays.asList(new File(directoryPathString).listFiles());
sorted.sort(Comparator.comparing(File::lastModified));