আপনি বাছাই করা ফাইলগুলি যদি একই সময়ে বাছাই করা হচ্ছে সংশোধন বা আপডেট করা যায়:
জাভা 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 এপিআই ব্যবহার করে উপরের উদাহরণে ফাইল অবজেক্টগুলিতে এবং থেকে অনুবাদ এড়াতে পারবেন , তবে, আপনার ল্যাম্বদার ভিতরে যাচাই করা আইও ব্যতিক্রমগুলি যা আপনাকে সর্বদা ব্যথার সাথে মোকাবিলা করতে হবে । আমি বলব পারফরম্যান্স যদি পর্যাপ্ত সমালোচনামূলক হয় যে অনুবাদটি গ্রহণযোগ্য নয় তবে আমি লাম্বডায় চেক করা আইওএক্সেপশনটিকে একটি চেক না করা আইওএক্সেপশন হিসাবে প্রচার করে বা ফাইল এপি সম্পূর্ণভাবে ফোরোগোস করে কেবল ফাইল অবজেক্টের সাথে ডিল করব:
final List<File> sorted = Arrays.asList(new File(directoryPathString).listFiles());
sorted.sort(Comparator.comparing(File::lastModified));