Apache Commons IO

Apache Commons IO

1. 概要

Apache Commonsプロジェクトは、日常のコードで使用できる一連の共通ライブラリを開発者に提供するために作成されました。

このチュートリアルでは、CommonsIOモジュールの主要なユーティリティクラスのいくつかとそれらの最もよく知られている機能について説明します。

2. メーベン依存

ライブラリを使用するには、pom.xmlに次のMaven依存関係を含めましょう。


    commons-io
    commons-io
    2.5

ライブラリの最新バージョンはMaven Centralにあります。

3. ユーティリティクラス

簡単に言えば、ユーティリティクラスは、perform common tasks on filesに使用できる静的メソッドのセットを提供します。

3.1. FileUtils

このクラスは、開く、読み取る、コピーする、移動するなど、ファイルに対してさまざまな操作を提供します。

FileUtilsを使用してhow to read or copy filesを見てみましょう。

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のいくつかの実装を提供します。

TeeInputStreamTeeOutputSteamに焦点を当てます。 「Tee」という単語(文字「T」から派生)は通常、単一の入力が2つの異なる出力に分割されることを説明するために使用されます。

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論理演算もサポートします。 したがって、これらのフィルターを組み合わせて、目的の結果を得ることができます。

WildcardFileFilterSuffixFileFilterを使用して、名前に「txt」サフィックスが付いた「ple」を含むファイルを取得する例を見てみましょう。 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を提供します。 ここでは、2つの異なるコンパレータについて説明します。

6.1. PathFileComparator

PathFileComparatorクラスは、大文字と小文字を区別する、大文字と小文字を区別しない、またはシステムに依存する大文字と小文字を区別する方法でsort lists or arrays of files by their pathに使用できます。 このユーティリティを使用して、resourcesディレクトリ内のファイルパスを並べ替える方法を見てみましょう。

@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に使用されます。 最初のファイルのサイズが2番目のファイルのサイズよりも小さい場合は、負の整数値を返します。 ファイルサイズが等しい場合はゼロを返し、最初のファイルのサイズが2番目のファイルのサイズより大きい場合は正の値を返します。

ファイルサイズの比較を示す単体テストを書いてみましょう。

@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モニターパッケージは、track changes to a file or directoryに機能を提供します。 FileAlterationMonitorFileAlterationObserverおよび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 IOパッケージで一般的に使用されるコンポーネントのいくつかを取り上げました。 ただし、パッケージには他にも多くの機能が付属しています。 詳細については、API documentationを参照してください。

この例で使用されているコードは、GitHub projectにあります。