Рубрики
Без рубрики

Apache Commons IO

Краткое и практическое руководство по библиотеке Apache Commons IO с открытым исходным кодом для Java, охватывающее многие из ее более известных функций.

Автор оригинала: baeldung.

1. Обзор

Проект Apache Commons был создан для того, чтобы предоставить разработчикам набор общих библиотек, которые они могут использовать в своем повседневном коде.

В этом уроке мы рассмотрим некоторые из ключевых классов утилит модуля ввода-вывода Commons и их наиболее известные функции.

2. Зависимость Maven

Чтобы использовать библиотеку, давайте включим следующую зависимость Maven в pom.xml :


    commons-io
    commons-io
    2.8.0

Последние версии библиотеки можно найти в Maven Central .

3. Классы полезности

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

3.1. Имена файлов

Этот класс предоставляет различные операции с файлами, такие как открытие, чтение, копирование и перемещение.

Давайте рассмотрим как читать или копировать файлы с помощью 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. Имена файлов

Эта утилита предоставляет не зависящий от операционной системы способ выполнения общих функций в именах файлов . Давайте рассмотрим некоторые из различных методов, которые мы можем использовать:

String fullPath = FilenameUtils.getFullPath(path);
String extension = FilenameUtils.getExtension(path);
String baseName = FilenameUtils.getBaseName(path);

3.3. Файловые системы

Мы можем использовать FileSystemUtils для проверки свободного места на заданном томе или диске :

long freeSpace = FileSystemUtils.freeSpaceKb("/");

4. Вход и выход

Этот пакет предоставляет несколько реализаций для работы с входными и выходными потоками .

Мы сосредоточимся на TeeInputStream и Teeoutputstream . Слово ” Tee “(производное от буквы ” T “) обычно используется для описания того, что один вход должен быть разделен на два разных выхода.

Давайте рассмотрим пример, который демонстрирует, как мы можем записать один входной поток в два разных выходных потока :

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 для извлечения файлов, в именах которых есть ” paleo “с суффиксом” 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.НЕЧУВСТВИТЕЛЬНАЯ конфигурация. PathFileComparator также предоставляет ряд экземпляров singleton, которые имеют различные параметры чувствительности к регистру и обратной сортировки .

Эти статические поля включают в себя PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR, и многие другие.

6.2. SizeFileComparator

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 monitor предоставляет возможность отслеживать изменения в файле или каталоге . Давайте рассмотрим краткий пример того, как 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. Тем не менее, пакет поставляется со многими другими возможностями. Пожалуйста, обратитесь к документации API для получения более подробной информации.

Код, используемый в этом примере, можно найти в проекте GitHub .