1. 概要

一時ディレクトリは、後で破棄できるファイルのセットを作成する必要がある場合に便利です。 一時ディレクトリを作成するときは、それらを配置する場所をオペレーティングシステムに委任したり、配置する場所を自分で指定したりできます。

この短いチュートリアルでは、さまざまなAPIとアプローチを使用してJavaに一時ディレクトリを作成する方法を学習します。 このチュートリアルのすべての例は、プレーンJava 7 +、 Guava 、および Apache CommonsIOを使用して実行されます。

2. オペレーティングシステムへの委任

一時ディレクトリの作成に使用される最も一般的なアプローチの1つは、宛先を基盤となるオペレーティングシステムに委任することです。 場所はjava.io.tmpdirプロパティによって指定され、すべてのオペレーティングシステムには独自の構造とクリーンアップルーチンがあります。

プレーンJavaでは、ディレクトリに付けるプレフィックスを指定してディレクトリを作成します。

String tmpdir = Files.createTempDirectory("tmpDirPrefix").toFile().getAbsolutePath();
String tmpDirsLocation = System.getProperty("java.io.tmpdir");
assertThat(tmpdir).startsWith(tmpDirsLocation);

Guavaを使用した場合のプロセスは似ていますが、ディレクトリのプレフィックスを指定する方法を指定できません。

String tmpdir = Files.createTempDir().getAbsolutePath();
String tmpDirsLocation = System.getProperty("java.io.tmpdir");
assertThat(tmpdir).startsWith(tmpDirsLocation);

Apache Commons IOは、一時ディレクトリを作成する方法を提供していません。 これは、オペレーティングシステムの一時ディレクトリを取得するためのラッパーを提供します。その後、残りの作業は私たちが行います。

String tmpDirsLocation = System.getProperty("java.io.tmpdir");
Path path = Paths.get(FileUtils.getTempDirectory().getAbsolutePath(), UUID.randomUUID().toString());
String tmpdir = Files.createDirectories(path).toFile().getAbsolutePath();
assertThat(tmpdir).startsWith(tmpDirsLocation);

既存のディレクトリとの名前の衝突を避けるために、 UUID.randomUUID()を使用してランダムな名前のディレクトリを作成します。

3. 場所の指定

一時ディレクトリを作成する場所を指定する必要がある場合があります。 良い例は、Mavenビルド中です。 すでに「一時的な」ビルドtargetディレクトリがあるので、そのディレクトリを利用して、ビルドに必要な一時的なディレクトリを配置できます。

Path tmpdir = Files.createTempDirectory(Paths.get("target"), "tmpDirPrefix");
assertThat(tmpdir.toFile().getPath()).startsWith("target");

GuavaとApacheCommonsIOの両方に、特定の場所に一時ディレクトリを作成する方法がありません。

ターゲットディレクトリは、ビルド構成によって異なる場合があることに注意してください。 防弾にする1つの方法は、テストを実行しているJVMにターゲットディレクトリの場所を渡すことです。

オペレーティングシステムがクリーンアップを処理していないため、 File.deleteOnExit()を使用できます。

tmpdir.toFile().deleteOnExit();

このように、ファイルはJVMが終了すると削除されますが、終了が正常な場合に限ります

4. 異なるファイル属性の使用

他のファイルやディレクトリと同様に、一時ディレクトリの作成時にファイル属性を指定することができます。 したがって、一時ディレクトリを作成するユーザーだけが読み取ることができる一時ディレクトリを作成する場合は、それを実現する一連の属性を指定できます。

FileAttribute<Set> attrs = PosixFilePermissions.asFileAttribute(
  PosixFilePermissions.fromString("r--------"));
Path tmpdir = Files.createTempDirectory(Paths.get("target"), "tmpDirPrefix", attrs);
assertThat(tmpdir.toFile().getPath()).startsWith("target");
assertThat(tmpdir.toFile().canWrite()).isFalse();

予想どおり、GuavaおよびApache Commons IOは、一時ディレクトリを作成するときに属性を指定する方法を提供していません。

前の例では、UnixやmacOSなどのPosix準拠のファイルシステムを使用していることを前提としていることにも注意してください。

ファイル属性の詳細については、NIO2ファイル属性APIのガイドを参照してください。

5. 結論

この短いチュートリアルでは、プレーンJava 7以降、Guava、およびApacheCommonsIOで一時ディレクトリを作成する方法について説明しました。 プレーンJavaは、冗長性を最小限に抑えながら幅広い可能性を提供するため、一時ディレクトリを作成するための最も柔軟な方法であることがわかりました。

いつものように、このチュートリアルのすべてのソースコードは、GitHubからで入手できます。