Apache Commons IO

1. Übersicht

Das Apache Commons-Projekt wurde erstellt, um Entwicklern eine Reihe allgemeiner Bibliotheken zur Verfügung zu stellen, die sie in ihrem täglichen Code verwenden können.

In diesem Tutorial werden einige der wichtigsten Dienstprogrammklassen des Commons IO-Moduls und ihre bekanntesten Funktionen erläutert.

2. Maven-Abhängigkeit

Um die Bibliothek zu verwenden, fügen wir die folgende Maven-Abhängigkeit in die pom.xml ein :

 commons-io commons-io 2.5 

Die neuesten Versionen der Bibliothek finden Sie in Maven Central.

3. Dienstprogrammklassen

Einfach ausgedrückt, bieten Dienstprogrammklassen eine Reihe statischer Methoden, mit denen allgemeine Aufgaben für Dateien ausgeführt werden können .

3.1. FileUtils

Diese Klasse bietet verschiedene Vorgänge für Dateien, z. B. Öffnen, Lesen, Kopieren und Verschieben.

Schauen wir uns an, wie Sie Dateien mit FileUtils lesen oder kopieren :

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. DateinameUtils

Dieses Dienstprogramm bietet eine betriebssystemunabhängige Möglichkeit, allgemeine Funktionen für Dateinamen auszuführen . Sehen wir uns einige der verschiedenen Methoden an, die wir anwenden können:

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

3.3. FileSystemUtils

Wir können FileSystemUtils verwenden , um den freien Speicherplatz auf einem bestimmten Volume oder Laufwerk zu überprüfen :

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

4. Ein- und Ausgabe

Dieses Paket enthält verschiedene Implementierungen für die Arbeit mit Eingabe- und Ausgabestreams .

Wir konzentrieren uns auf TeeInputStream und TeeOutputSteam . Das Wort " Tee " (abgeleitet vom Buchstaben " T ") wird normalerweise verwendet, um zu beschreiben, dass ein einzelner Eingang in zwei verschiedene Ausgänge aufgeteilt werden soll.

Schauen wir uns ein Beispiel an, das zeigt, wie wir einen einzelnen Eingabestream in zwei verschiedene Ausgabestreams schreiben können :

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. Filter

Commons IO enthält eine Liste nützlicher Dateifilter. Diese können nützlich sein, wenn ein Entwickler eine bestimmte gewünschte Liste von Dateien aus einer heterogenen Liste von Dateien eingrenzen möchte .

Die Bibliothek unterstützt auch UND- und ODER- Logikoperationen für eine bestimmte Dateiliste. Daher können wir diese Filter mischen und anpassen, um das gewünschte Ergebnis zu erzielen.

Mal sehen , ein Beispiel , dass Marken verwenden WildcardFileFilter und SuffixFileFilter Dateien abzurufen , die „haben ple “ in ihrem Namen mit einem „ txt “ Suffix. Beachten Sie, dass wir die obigen Filter mit ANDFileFilter umbrechen :

@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. Komparatoren

Das Comparator- Paket bietet verschiedene Arten von Vergleichen für Dateien . Wir werden hier zwei verschiedene Komparatoren untersuchen.

6.1. PathFileComparator

Die PathFileComparator- Klasse kann verwendet werden, um Listen oder Arrays von Dateien nach ihrem Pfad zu sortieren , wobei die Groß- und Kleinschreibung nicht berücksichtigt wird , die Groß- und Kleinschreibung nicht berücksichtigt wird oder das System von der Groß- und Kleinschreibung abhängt. Sehen wir uns an, wie Sie mit diesem Dienstprogramm Dateipfade im Ressourcenverzeichnis sortieren:

@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()); }

Beachten Sie, dass wir die Konfiguration IOCase.INSENSITIVE verwendet haben. PathFileComparator bietet auch eine Reihe von Singleton-Instanzen mit unterschiedlichen Optionen für Groß- und Kleinschreibung und umgekehrte Sortierung .

Diese statischen Felder umfassen PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR, um nur einige zu nennen.

6.2. SizeFileComparator

SizeFileComparator wird, wie der Name schon sagt, verwendet, um die Größen (Längen) von zwei Dateien zu vergleichen . Es wird ein negativer ganzzahliger Wert zurückgegeben, wenn die Größe der ersten Datei kleiner als die der zweiten Datei ist. Es gibt Null zurück, wenn die Dateigrößen gleich sind, und einen positiven Wert, wenn die Größe der ersten Datei größer als die Größe der zweiten Datei ist.

Schreiben wir einen Komponententest, der einen Vergleich der Dateigrößen demonstriert:

@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. Dateimonitor

Das Commons IO-Monitorpaket bietet die Möglichkeit, Änderungen an einer Datei oder einem Verzeichnis zu verfolgen . Sehen wir uns ein kurzes Beispiel an, wie FileAlterationMonitor zusammen mit FileAlterationObserver und FileAlterationListener zum Überwachen einer Datei oder eines Ordners verwendet werden kann.

Wenn FileAlterationMonitor gestartet wird , erhalten wir Benachrichtigungen über Dateiänderungen in dem Verzeichnis, das überwacht wird :

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. Fazit

Dieser Artikel behandelte einige der häufig verwendeten Komponenten des Commons IO-Pakets. Das Paket bietet jedoch auch viele andere Funktionen. Weitere Informationen finden Sie in der API-Dokumentation.

Der in diesem Beispiel verwendete Code befindet sich im GitHub-Projekt.