1. Обзор
Проект Apache Commons был создан, чтобы предоставить разработчикам набор общих библиотек, которые они могут использовать в своем повседневном коде.
В этом руководстве мы рассмотрим некоторые ключевые служебные классы модуля Commons IO и их наиболее известные функции.
2. Зависимость от Maven
Чтобы использовать библиотеку, давайте включим следующую зависимость Maven в pom.xml
:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
Последние версии библиотеки можно найти в Maven Central .
3. Полезные классы
Проще говоря, служебные классы предоставляют наборы статических методов, которые можно использовать для выполнения общих задач над файлами .
3.1. FileUtils
Этот класс обеспечивает различные операции с файлами, такие как открытие, чтение, копирование и перемещение.
Давайте посмотрим, как читать или копировать файлы с помощью FileUtils
:
File file = FileUtils.getFile(getClass().getClassLoader()
.getResource("fileTest.txt")
.getPath());
File tempDir = FileUtils.getTempDirectory();
FileUtils.copyFileToDirectory(file, tempDir);
File newTempFile = FileUtils.getFile(tempDir, file.getName());
String data = FileUtils.readFileToString(newTempFile,
Charset.defaultCharset());
3.2. Имя файлаUtils
Эта утилита обеспечивает независимый от операционной системы способ выполнения общих функций с именами файлов . Давайте рассмотрим некоторые из различных методов, которые мы можем использовать:
String fullPath = FilenameUtils.getFullPath(path);
String extension = FilenameUtils.getExtension(path);
String baseName = FilenameUtils.getBaseName(path);
3.3. FileSystemUtils
Мы можем использовать FileSystemUtils
для проверки свободного места на данном томе или диске :
long freeSpace = FileSystemUtils.freeSpaceKb("/");
4. Ввод и вывод
Этот пакет предоставляет несколько реализаций для работы с входными и выходными потоками .
Мы сосредоточимся на TeeInputStream
и TeeOutputSteam
. Слово « тройник
» (производное от буквы « Т
») обычно используется для описания того, что один вход должен быть разделен на два разных выхода.
Давайте посмотрим на пример, демонстрирующий, как мы можем записать один входной поток в два разных выходных потока :
String str = "Hello World.";
ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes());
ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream();
ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream();
FilterOutputStream teeOutputStream
= new TeeOutputStream(outputStream1, outputStream2);
new TeeInputStream(inputStream, teeOutputStream, true)
.read(new byte[str.length()]);
assertEquals(str, String.valueOf(outputStream1));
assertEquals(str, String.valueOf(outputStream2));
5. Фильтры
Commons IO включает в себя список полезных файловых фильтров. Они могут пригодиться, когда разработчик хочет сузить до определенного желаемого списка файлов из разнородного списка файлов.
Библиотека также поддерживает логические операции И
и ИЛИ
для заданного списка файлов. Поэтому мы можем смешивать и сочетать эти фильтры, чтобы получить желаемый результат.
Давайте рассмотрим пример, который использует WildcardFileFilter
и SuffixFileFilter
для извлечения файлов, в именах которых есть «ple» с суффиксом « txt
» .
Обратите внимание, что мы оборачиваем вышеуказанные фильтры с помощью ANDFileFilter
:
@Test
public void whenGetFilewith_ANDFileFilter_thenFind_sample_txt()
throws IOException {
String path = getClass().getClassLoader()
.getResource("fileTest.txt")
.getPath();
File dir = FileUtils.getFile(FilenameUtils.getFullPath(path));
assertEquals("sample.txt",
dir.list(new AndFileFilter(
new WildcardFileFilter("*ple*", IOCase.INSENSITIVE),
new SuffixFileFilter("txt")))[0]);
}
6. Компараторы
Пакет Comparator
обеспечивает различные типы сравнений файлов . Здесь мы рассмотрим два разных компаратора.
6.1. PathFileComparator
Класс PathFileComparator
можно использовать для сортировки списков или массивов файлов по пути к ним с учетом регистра, без учета регистра или с учетом регистра в зависимости от системы. Давайте посмотрим, как отсортировать пути к файлам в каталоге ресурсов с помощью этой утилиты:
@Test
public void whenSortDirWithPathFileComparator_thenFirstFile_aaatxt()
throws IOException {
PathFileComparator pathFileComparator = new PathFileComparator(
IOCase.INSENSITIVE);
String path = FilenameUtils.getFullPath(getClass()
.getClassLoader()
.getResource("fileTest.txt")
.getPath());
File dir = new File(path);
File[] files = dir.listFiles();
pathFileComparator.sort(files);
assertEquals("aaa.txt", files[0].getName());
}
Обратите внимание, что мы использовали конфигурацию IOCase.INSENSITIVE
. PathFileComparator
также предоставляет ряд одноэлементных экземпляров с различными параметрами учета регистра и обратной сортировки .
Эти статические поля включают PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR и
многие другие.
6.2. Компаратор сайзфайлов
SizeFileComparator
, как следует из названия, используется для сравнения размеров (длин) двух файлов . Он возвращает отрицательное целое значение, если размер первого файла меньше размера второго файла. Он возвращает ноль, если размеры файлов равны, и положительное значение, если размер первого файла больше размера второго файла.
Давайте напишем модульный тест, демонстрирующий сравнение размеров файлов:
@Test
public void whenSizeFileComparator_thenLargerFile_large()
throws IOException {
SizeFileComparator sizeFileComparator = new SizeFileComparator();
File largerFile = FileUtils.getFile(getClass().getClassLoader()
.getResource("fileTest.txt")
.getPath());
File smallerFile = FileUtils.getFile(getClass().getClassLoader()
.getResource("sample.txt")
.getPath());
int i = sizeFileComparator.compare(largerFile, smallerFile);
Assert.assertTrue(i > 0);
}
7. Файловый монитор
Пакет монитора Commons IO предоставляет возможность отслеживать изменения в файле или каталоге . Давайте рассмотрим краткий пример того, как FileAlterationMonitor
можно использовать вместе с FileAlterationObserver
и FileAlterationListener
для мониторинга файла или папки.
Когда FileAlterationMonitor
запустится, мы начнем получать уведомления об изменениях файлов в отслеживаемом каталоге :
FileAlterationObserver observer = new FileAlterationObserver(folder);
FileAlterationMonitor monitor = new FileAlterationMonitor(5000);
FileAlterationListener fal = new FileAlterationListenerAdaptor() {
@Override
public void onFileCreate(File file) {
// on create action
}
@Override
public void onFileDelete(File file) {
// on delete action
}
};
observer.addListener(fal);
monitor.addObserver(observer);
monitor.start();
8. Заключение
В этой статье были рассмотрены некоторые часто используемые компоненты пакета Commons IO. Тем не менее, пакет также имеет множество других возможностей. Дополнительные сведения см . в документации по API .
Код, использованный в этом примере, можно найти в проекте GitHub .