यदि आप जो फाइलें छांट रहे हैं, उन्हें उसी समय संशोधित या अपडेट किया जा सकता है:
जावा 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;
}
ये दोनों समाधान निर्देशिका में प्रत्येक फ़ाइल के लिए एक निरंतर अंतिम संशोधित समय को बचाने के लिए एक अस्थायी मानचित्र डेटा संरचना बनाते हैं। इसका कारण हमें यह करने की आवश्यकता है कि यदि आपकी फ़ाइलों को अपडेट किया जा रहा है या संशोधित किया जा रहा है, जबकि आपकी तरह का प्रदर्शन किया जा रहा है, तो आपका तुलनित्र तुलनित्र इंटरफ़ेस के सामान्य अनुबंध की ट्रांज़ेक्शन आवश्यकता का उल्लंघन कर रहा होगा क्योंकि तुलना के दौरान अंतिम संशोधित समय बदल सकता है।
यदि, दूसरी ओर, आप जानते हैं कि आपके सॉर्ट के दौरान फाइलें अपडेट या संशोधित नहीं होंगी, तो आप इस प्रश्न के लिए प्रस्तुत किए गए किसी भी अन्य उत्तर के साथ दूर हो सकते हैं, जिनमें से मैं आंशिक रूप से निम्नलिखित हूं:
जावा 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());
}
}
नोट: मुझे पता है कि आप उपरोक्त उदाहरणों में फ़ाइल ऑब्जेक्ट्स से फ़ाइल ऑब्जेक्ट्स में अनुवाद से बच सकते हैं :: getLastModifiedTime api को सॉर्ट स्ट्रीम ऑपरेशन में, फिर भी, आपको अपने लैम्ब्डा के अंदर चेक किए गए IO अपवादों से निपटने की आवश्यकता है जो हमेशा एक दर्द होता है। । मैं कहूंगा कि यदि प्रदर्शन पर्याप्त रूप से महत्वपूर्ण है कि अनुवाद अस्वीकार्य है, तो मैं या तो लेम्बडा में चेक किए गए IOException के साथ इसे अनचेक किए गए अपवाद के रूप में प्रचारित करूंगा या मैं फ़ाइलों को पूरी तरह से अप्रूव कर दूंगा और फ़ाइल ऑब्जेक्ट्स के साथ सौदा करूंगा:
final List<File> sorted = Arrays.asList(new File(directoryPathString).listFiles());
sorted.sort(Comparator.comparing(File::lastModified));