Перейти к основному содержимому

Найдите последний измененный файл в каталоге с помощью Java

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы подробно рассмотрим, как найти последний измененный файл в определенном каталоге в Java.

Во-первых, мы начнем с устаревшего ввода -вывода и современных API-интерфейсов NIO. Затем мы увидим, как использовать библиотеку ввода-вывода Apache Commons для достижения той же цели.

2. Использование API java.io ****

Устаревший пакет java.io предоставляет класс File для инкапсуляции абстрактного представления путей к файлам и каталогам.

К счастью, в классе File есть удобный метод lastModified(). Этот метод возвращает время последнего изменения файла, обозначенного абстрактным путем .

Давайте теперь посмотрим, как мы можем использовать класс java.io.File для достижения намеченной цели:

public static File findUsingIOApi(String sdir) {
File dir = new File(sdir);
if (dir.isDirectory()) {
Optional<File> 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() , чтобы получить файл с самыми последними изменениями .

Обратите внимание, что мы используем необязательный экземпляр для инкапсуляции последнего измененного файла.

Имейте в виду, что этот подход считается старомодным и устаревшим. Однако мы можем использовать его, если хотим сохранить совместимость с устаревшим миром ввода-вывода 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<Path> 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;
}

Как и в первом примере, мы полагаемся на API Steam для получения только файлов. Затем мы сортируем наши файлы по времени последнего изменения с помощью лямбда-выражения .

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

Apache Commons IO вывел управление файловой системой на новый уровень. Он предоставляет набор удобных классов, файловых компараторов, файловых фильтров и многого другого.

К счастью для нас, библиотека предлагает класс LastModifiedFileComparator , который можно использовать в качестве компаратора для сортировки массива файлов по времени их последнего изменения .

Во- первых, нам нужно добавить зависимость commons-io в наш pom.xml :

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>

Наконец, давайте продемонстрируем, как найти последний измененный файл в папке с помощью 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;
}

Как показано выше, мы используем экземпляр singleton LASTMODIFIED_REVERSE для сортировки нашего массива файлов в обратном порядке .

Поскольку массив отсортирован в обратном порядке, то последний измененный файл является первым элементом массива.

5. Вывод

В этом руководстве мы рассмотрели различные способы поиска последнего измененного файла в определенном каталоге. Попутно мы использовали API, которые являются частью JDK и внешней библиотеки Apache Commons IO.

Как всегда, полный исходный код примеров доступен на GitHub .