Apache Commons IO

Apache Commons IO

1. Überblick

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 folgenden Maven-Abhängigkeiten inpom.xml ein:


    commons-io
    commons-io
    2.5

Die neuesten Versionen der Bibliothek finden Sie inMaven Central.

3. Dienstprogrammklassen

Einfach ausgedrückt, bieten Dienstprogrammklassen Sätze statischer Methoden, die fürperform common tasks on files verwendet werden können.

3.1. FileUtils

Diese Klasse bietet verschiedene Funktionen zum Öffnen, Lesen, Kopieren und Verschieben von Dateien.

Schauen wir unshow to read or copy files mitFileUtils an:

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

Dieses Dienstprogramm liefertoperating-system-agnostic way of executing common functions on file names. Sehen wir uns einige der verschiedenen Methoden an, die wir verwenden können:

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

3.3. FileSystemUtils

Wir könnenFileSystemUtils bischeck the free space on a given volume or drive verwenden:

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

4. Ein- und Ausgang

Dieses Paket enthält mehrere Implementierungen fürworking with input and output streams.

Wir konzentrieren uns aufTeeInputStream undTeeOutputSteam. 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 wirwrite a single input stream to two different output streams 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 Entwicklernarrow down to a specific desired list of files aus einer heterogenen Liste von Dateien entfernen möchte.

Die Bibliothek unterstützt auch die logischen OperationenAND undOR für eine bestimmte Dateiliste. Daher können wir diese Filter mischen und anpassen, um das gewünschte Ergebnis zu erzielen.

Sehen wir uns ein Beispiel an, in demWildcardFileFilter undSuffixFileFilter verwendet werden, um Dateien abzurufen, deren Namen "ple" mit dem Suffix "txt" enthalten. Beachten Sie, dass wir die obigen Filter mitANDFileFilter umschließen:

@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 PaketComparator enthältdifferent types of comparisons on files. Wir werden hier zwei verschiedene Komparatoren untersuchen.

6.1. PathFileComparator

Die KlassePathFileComparator kann fürsort lists or arrays of files by their path entweder in Groß- und Kleinschreibung, in Groß- und Kleinschreibung oder systemabhängig verwendet werden. 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 vonIOCase.INSENSITIVEverwendet haben. PathFileComparator liefert auch eine Anzahl vonsingleton instances that have different case-sensitivity and reverse-sorting options.

Diese statischen Felder enthaltenPATH_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, ancompare the sizes (lengths) of two files verwendet. 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 fürtrack changes to a file or directory. Sehen wir uns ein kurzes Beispiel an, wieFileAlterationMonitor zusammen mitFileAlterationObserver undFileAlterationListener zum Überwachen einer Datei oder eines Ordners verwendet werden können.

WennFileAlterationMonitor 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 befasste sich mit einigen der am häufigsten verwendeten Komponenten des Commons IO-Pakets. Das Paket enthält jedoch auch viele andere Funktionen. Weitere Informationen finden Sie unterAPI documentation.

Der in diesem Beispiel verwendete Code befindet sich inGitHub project.