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 .