Автор оригинала: Abderrahim Azhrioun.
1. Обзор
В этом кратком руководстве мы подробно рассмотрим, как найти последний измененный файл в определенном каталоге Java.
Во-первых, мы начнем с legacy IO и modern NIO API. Затем мы посмотрим, как использовать библиотеку Apache Commons IO для достижения той же цели.
2. Использование java.io API
Наследие java.io package предоставляет класс File для инкапсуляции абстрактного представления путей к файлам и каталогам.
К счастью, класс File поставляется с удобным методом под названием last Modified(). Этот метод возвращает время последнего изменения файла, обозначенного абстрактным именем пути .
Давайте теперь посмотрим, как мы можем использовать java.io.Файл класс для достижения намеченной цели:
public static File findUsingIOApi(String sdir) { File dir = new File(sdir); if (dir.isDirectory()) { OptionalopFile = 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 legacy IO world .
3. Использование API java.nio
Внедрение API NIO – это поворотный момент в управлении файловой системой. Новая версия NIO.2, поставляемая в Java 7, поставляется с набором расширенных функций для лучшего управления файлами и манипуляций с ними.
На самом деле, файл java.nio.Класс Files предлагает большую гибкость, когда дело доходит до манипулирования файлами и каталогами в Java.
Итак, давайте посмотрим, как мы можем использовать класс Files для получения последнего измененного файла в каталоге:
public static Path findUsingNIOApi(String sdir) throws IOException { Path dir = Paths.get(sdir); if (Files.isDirectory(dir)) { OptionalopPath = 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 dependency в ваш pom.xml :
commons-io commons-io 2.8.0
Наконец, давайте продемонстрируем, как найти последний измененный файл в папке с помощью 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 LAST MODIFIED_REVERSE для сортировки нашего массива файлов в обратном порядке .
Поскольку массив отсортирован в обратном порядке, то последний измененный файл является первым элементом массива.
5. Заключение
В этом уроке мы исследовали различные способы поиска последнего измененного файла в определенном каталоге. По пути мы использовали API, которые являются частью JDK и внешней библиотеки Apache Commons IO.
Как всегда, полный исходный код примеров доступен на GitHub .