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 .