1. 概要

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

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

2. Mavenの依存関係

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

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

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

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

簡単に言えば、ユーティリティクラスは、ファイルで一般的なタスクを実行するために使用できる静的メソッドのセットを提供します

3.1. FileUtils

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

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

このユーティリティは、ファイル名で一般的な機能を実行するオペレーティングシステムに依存しない方法を提供します。 利用できるさまざまな方法のいくつかを見てみましょう。

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

3.3. FileSystemUtils

FileSystemUtils を使用して、特定のボリュームまたはドライブの空き領域を確認できます。

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

4. 入出力

このパッケージは、入力ストリームと出力ストリームを操作するためのいくつかの実装を提供します。

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

単一の入力ストリームを2つの異なる出力ストリームに書き込む方法を示す例を見てみましょう。

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には、便利なファイルフィルターのリストが含まれています。 これらは、開発者が異種のファイルリストから特定の目的のファイルリストに絞り込みたい場合に便利です。

このライブラリは、特定のファイルリストに対するANDおよびOR論理演算もサポートしています。 したがって、これらのフィルターを組み合わせて、目的の結果を得ることができます。

WildcardFileFilterSuffixFileFilterを使用して、名前に「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. コンパレータ

コンパレータパッケージは、ファイルのさまざまなタイプの比較を提供します。 ここでは、2つの異なるコンパレータについて説明します。

6.1. PathFileComparator

PathFileComparator クラスを使用すると、大文字と小文字を区別する、大文字と小文字を区別しない、またはシステムに依存する大文字と小文字を区別する方法で、パスによってファイルのリストまたは配列を並べ替えることができます。 このユーティリティを使用して、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 は、大文字と小文字の区別と逆ソートオプションが異なる多数のシングルトンインスタンスも提供します。

これらの静的フィールドには、 PATH_COMPARATOR、PATH_INSENSITIVE_COMPARATOR、PATH_INSENSITIVE_REVERSE、PATH_SYSTEM_COMPARATOR、などがあります。

6.2. SizeFileComparator

SizeFileComparator は、その名前が示すように、 2つのファイルのサイズ(長さ)を比較するために使用されます。 最初のファイルのサイズが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モニターパッケージは、ファイルまたはディレクトリへの変更を追跡する機能を提供します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. 結論

この記事では、CommonsIOパッケージの一般的に使用されるコンポーネントのいくつかについて説明しました。 ただし、パッケージには他の多くの機能も含まれています。 詳細については、APIドキュメントを参照してください。

この例で使用されているコードは、GitHubプロジェクトにあります。