1概要

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

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


2 Mavenの依存関係

このライブラリを使用するには、

pom.xml

に次のMaven依存関係を含めます。

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

ライブラリの最新版はhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22commons-io%22%20AND%20a%3A%22commons-io%22にあります。[Maven Central]


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入出力

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

私たちは

TeeInputStream



TeeOutputSteam

に焦点を当てます。単語「

Tee

」(文字「

T

」から派生)は通常、単一の入力が2つの異なる出力に分割されることを表すために使用されます。

1つの入力ストリームを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

のロジック操作もサポートします。したがって、これらのフィルタを組み合わせて目的の結果を得ることができます。


WildcardFileFilter



SuffixFileFilter

を使用して、名前に ”

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. コンパレータ


Comparator

パッケージは、

ファイル上で

さまざまな種類の比較を提供します。ここでは、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モニターパッケージはファイルまたはディレクトリへの変更を追跡する機能を提供します。

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 IOパッケージの一般的に使用されるコンポーネントについて説明しました。ただし、このパッケージには他にも多くの機能があります。詳細についてはhttps://commons.apache.org/proper/commons-io/javadocs/api-2.5/index.html[APIのドキュメント]を参照してください。

この例で使用されているコードはhttps://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[GitHub project]にあります。