Намерете последния модифициран файл в директория с Java

1. Общ преглед

В този бърз урок ще разгледаме отблизо как да намерим последния модифициран файл в конкретна директория в Java.

Първо, ще започнем с наследения IO и модерните API на NIO. След това ще видим как да използваме библиотеката на Apache Commons IO, за да постигнем същото.

2. Използване на java.io API

Наследственият пакет java.io предоставя класът File, за да капсулира абстрактно представяне на имена на файлове и директории.

За щастие класът File се предлага с удобен метод, наречен lastModified (). Този метод връща последното модифицирано време на файла, обозначено с абстрактно име на път .

Нека сега разгледаме как можем да използваме класа java.io.File, за да постигнем целта:

public static File findUsingIOApi(String sdir) { File dir = new File(sdir); if (dir.isDirectory()) { Optional opFile = Arrays.stream(dir.listFiles(File::isFile)) .max((f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified())); if (opFile.isPresent()){ return opFile.get(); } } return null; }

Както виждаме, използваме Java 8 Stream API, за да прелистваме масив от файлове. След това извикваме операцията max () , за да получим файла с най-новите модификации .

Забележете, че използваме незадължителен екземпляр за капсулиране на последния модифициран файл.

Имайте предвид, че този подход се счита за стара мода и остарял. Можем обаче да го използваме, ако искаме да останем съвместими със света на наследяването на IO на Java .

3. Използване на API на java.nio

Въвеждането на NIO API е повратна точка за управление на файловата система. Новата версия NIO.2, доставена в Java 7, идва с набор от подобрени функции за по-добро управление на файлове и манипулация.

Всъщност класът java.nio.file.Files предлага голяма гъвкавост, когато става въпрос за манипулиране на файлове и директории в Java.

И така, нека видим как можем да използваме класа Files, за да получим последния модифициран файл в директория:

public static Path findUsingNIOApi(String sdir) throws IOException { Path dir = Paths.get(sdir); if (Files.isDirectory(dir)) { Optional opPath = Files.list(dir) .filter(p -> !Files.isDirectory(p)) .sorted((p1, p2)-> Long.valueOf(p2.toFile().lastModified()) .compareTo(p1.toFile().lastModified())) .findFirst(); if (opPath.isPresent()){ return opPath.get(); } } return null; }

Подобно на първия пример, разчитаме на Steam API, за да получаваме само файлове. След това сортираме файловете си въз основа на последното модифицирано време с помощта на ламбда израз .

4. Използване на Apache Commons IO

Apache Commons IO издигна управлението на файловата система на следващото ниво. Той предоставя набор от удобни класове, файлови компаратори, файлови филтри и много други.

За наше щастие библиотеката предлага клас LastModifiedFileComparator, който може да се използва като сравнител за сортиране на масив от файлове по последно промененото им време .

Първо, трябва да добавим зависимостта commons-io в нашия pom.xml :

 commons-io commons-io 2.7 

И накрая, нека покажем как да намерим последния модифициран файл в папка с помощта на Apache Commons IO:

public static File findUsingCommonsIO(String sdir) { File dir = new File(sdir); if (dir.isDirectory()) { File[] dirFiles = dir.listFiles((FileFilter)FileFilterUtils.fileFileFilter()); if (dirFiles != null && dirFiles.length > 0) { Arrays.sort(dirFiles, LastModifiedFileComparator.LASTMODIFIED_REVERSE); return dirFiles[0]; } } return null; }

Както е показано по-горе, ние използваме единичния екземпляр LASTMODIFIED_REVERSE, за да сортираме нашия масив от файлове в обратен ред .

Тъй като масивът е сортиран обратно, тогава последният модифициран файл е първият елемент от масива.

5. Заключение

В този урок проучихме различни начини за намиране на последния модифициран файл в определена директория. По пътя използвахме API, които са част от JDK и външната библиотека на Apache Commons IO.

Както винаги, пълният кодов източник на примерите е достъпен в GitHub.