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

Apache Commons IO

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

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 .