Apache Commons IO

Apache Commons IO

1. обзор

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

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

2. Maven Dependency

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


    commons-io
    commons-io
    2.5

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

3. Утилиты

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

3.1. FileUtilsс

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

Давайте посмотрим наhow to read or copy files, используя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. FilenameUtilsс

Эта утилита предоставляетoperating-system-agnostic way of executing common functions on file names. Давайте посмотрим, какие методы мы можем использовать:

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

3.3. FileSystemUtilsс

Мы можем использоватьFileSystemUtils доcheck the free space on a given volume or drive:

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

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

Этот пакет предоставляет несколько реализаций дляworking with input and output streams.

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

Давайте посмотрим на пример, демонстрирующий, как мы можемwrite a single input stream to two different output streams:

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 включает в себя список полезных файловых фильтров. Это может пригодиться, когда разработчик хочетnarrow down to a specific desired list of files из разнородного списка файлов.

Библиотека также поддерживает логические операцииAND иOR над заданным списком файлов. Поэтому мы можем смешивать и сопоставлять эти фильтры, чтобы получить желаемый результат.

Давайте посмотрим на пример, в котором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 предоставляетdifferent types of comparisons on files. Здесь мы рассмотрим два разных компаратора.

6.1. PathFileComparatorс

КлассPathFileComparator может использоваться дляsort lists or arrays of files by their path с учетом регистра, без учета регистра или с учетом регистра символов системы. Давайте посмотрим, как отсортировать пути к файлам в каталоге ресурсов с помощью этой утилиты:

@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 также предоставляет количествоsingleton instances that have different case-sensitivity and reverse-sorting options.

Эти статические поля включают в себяPATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR,, чтобы назвать несколько.

6.2. SizeFileComparatorс

SizeFileComparator, как следует из названия, используется дляcompare the sizes (lengths) of two files. Он возвращает отрицательное целое число, если размер первого файла меньше, чем размер второго файла. Он возвращает ноль, если размеры файлов равны, и положительное значение, если размер первого файла больше, чем размер второго файла.

Напишем модульный тест, демонстрирующий сравнение размеров файлов:

@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 предоставляет возможностьtrack changes to a file or directory. Давайте посмотрим на быстрый пример того, как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 documentation для получения более подробной информации.

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