HOWTO · Java

Java でディレクトリを作成する

このチュートリアルでは、Java でディレクトリを作成する方法について説明します

このページの内容

ディレクトリは、ファイルを格納するためのファイルシステム上のカタログ構造であり、その作成は Java における一般的なファイル処理タスクです。JDK にはそのための API が 2つあります。レガシーな java.io.File のメソッドと新しい java.nio.file.Files のヘルパーです。さらに Apache Commons IO が 3つ目の選択肢を提供します。このチュートリアルでは、それぞれの方法と、選択する際に重要となる動作の違いを説明します。

Java のディレクトリ作成メソッドの選び方

ほとんどの新しいコードでは java.nio.file.Files を推奨します。親ディレクトリの一部がまだ存在しない可能性がある場合は Files.createDirectories(path) を呼び出してください。1回の呼び出しでパス全体を作成し、ディレクトリがすでに存在するという理由だけでは失敗しません。既存のターゲットを失敗として扱う必要がある場合は、代わりに Files.createDirectory(path) を呼び出します。古い File.mkdir() と File.mkdirs() は boolean 値でしか成功を報告しないため見落としやすいのに対し、Files のメソッドは問題を正確に特定するチェック例外をスローします。FileUtils.forceMkdir() は、すでに Apache Commons IO に依存しているコードベースでのみ妥当な選択肢です。

重要な違いは、存在しない親ディレクトリとすでに存在するターゲットを各メソッドがどう処理するかです。

メソッド 親ディレクトリが存在しない場合 ターゲットディレクトリが既存の場合 失敗の通知
File.mkdir() 失敗し false を返す false を返す boolean の戻り値
File.mkdirs() 親ディレクトリを作成する false を返す boolean の戻り値
Files.createDirectory() NoSuchFileException FileAlreadyExistsException IOException のチェック例外サブタイプ
Files.createDirectories() 親ディレクトリを作成する 正常に返る IOException のチェック例外サブタイプ
FileUtils.forceMkdir() 親ディレクトリを作成する 正常に返る IOException

File.mkdir() で単一のディレクトリを作成する

File.mkdir() は、File インスタンスが保持するパスにディレクトリを 1つだけ作成します。実際にディレクトリを作成した場合にのみ true を返し、名前がすでに使われている場合、親ディレクトリが存在しない場合、またはオペレーティングシステムが要求を拒否した場合は false を返します。成功を前提とせず、必ず戻り値を確認してください。

次のプログラムは、作業ディレクトリ内に reports という名前のディレクトリを 1つ作成し、結果を出力します(コードと出力内のメッセージは原文どおり英語のまま表示されます)。

import java.io.File;

public class MkdirExample {
    public static void main(String[] args) {
        File dir = new File("reports");
        boolean created = dir.mkdir();
        System.out.println("mkdir() returned: " + created);
        System.out.println("Directory exists: " + dir.isDirectory());
    }
}
mkdir() returned: true
Directory exists: true

false の結果からは原因がわかりません。既存のディレクトリがあっても問題ない場合は実行後に dir.isDirectory() を確認するか、型付きの失敗を得られる Files.createDirectory() に切り替えてください。mkdir() は、セキュリティマネージャーが書き込みアクセスを拒否した場合に、非チェック例外の SecurityException をスローすることもあります。

File.mkdirs() でディレクトリツリーを作成する

File.mkdirs() は、ターゲットディレクトリとパス上の不足しているすべての親ディレクトリを 1回の呼び出しで作成します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import java.io.File;

public class MkdirsExample {
    public static void main(String[] args) {
        File dir = new File("reports/2026/october");
        boolean created = dir.mkdirs();
        System.out.println("mkdirs() returned: " + created);
        System.out.println("Directory exists: " + dir.isDirectory());
    }
}
mkdirs() returned: true
Directory exists: true

mkdirs() が true を返すのは、必要なすべての親ディレクトリとともにディレクトリを作成した場合だけである点に注意してください。既存のツリーに対して実行すると、何も問題がなくても false が返り、false の結果はどの階層で失敗したかも示しません。成功が単に「ディレクトリが存在する」ことを意味する場合は、isDirectory() で確認してください。

Files.createDirectory() で単一のディレクトリを作成する

Files.createDirectory(path) は mkdir() に相当する NIO のメソッドです。ディレクトリを 1つだけ作成し、親ディレクトリが存在しない場合は失敗します。失敗がチェック例外であるためコンパイラがその処理を強制し、例外の型が問題を特定します。名前がすでに使われている場合は FileAlreadyExistsException、親ディレクトリが存在しない場合は NoSuchFileException がスローされます。

このセクションのコードと表示されるラベルや出力は英語のままです。

import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CreateDirectoryExample {
    public static void main(String[] args) {
        Path path = Paths.get("logs");
        try {
            Files.createDirectory(path);
            System.out.println("Created directory: " + path);
        } catch (FileAlreadyExistsException e) {
            System.out.println("Already exists: " + path);
        } catch (IOException e) {
            System.out.println("Could not create directory: " + e);
        }
    }
}
Created directory: logs

FileAlreadyExistsException を個別にキャッチすると、よくある「すでに存在する」ケースを静かに処理しながら、他の IOException サブタイプは引き続き失敗として扱えます。

Files.createDirectories() でディレクトリツリーを作成する

Files.createDirectories(path) は、ターゲットと不足しているすべての親ディレクトリを 1回の呼び出しで作成します。mkdirs() とは異なり、ディレクトリがすでに存在する場合でも正常に返るため、単にパスが存在していればよい場合に推奨される呼び出しです。通常ファイルがそのパスを占有している場合は FileAlreadyExistsException をスローし、パーミッション拒否などの実際の失敗では他の IOException サブタイプをスローします。

このセクションのコードと表示されるラベルや出力は英語のままです。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CreateDirectoriesExample {
    public static void main(String[] args) {
        Path path = Paths.get("data/archive/2026");
        try {
            Files.createDirectories(path);
            System.out.println("Directory ready: " + path);
        } catch (IOException e) {
            System.out.println("Could not create directory: " + e);
        }
    }
}
Directory ready: data/archive/2026

Apache Commons IO の FileUtils.forceMkdir() を使用する

FileUtils.forceMkdir() は JDK の一部ではなく Apache Commons IO に含まれるため、プロジェクトに commons-io 依存関係が必要です(たとえば Maven や Gradle の commons-io:commons-io アーティファクト)。このライブラリは標準クラスパスに存在しないため、実行可能なサンプルではなくインラインで呼び出しを示します。

FileUtils.forceMkdir(new File("data/archive/2026"));

createDirectories() と同様に、ディレクトリと不足している親ディレクトリを作成し、ディレクトリがすでに存在する場合は例外をスローせず正常に返ります。名前に反して「force」は必要な親ディレクトリを作成することを指し、何かを上書きするわけではありません。ディレクトリ以外のファイルがそのパスを占有している場合やディレクトリを作成できない場合は IOException をスローします。コードベースがすでに Commons IO を使用している場合を除き、標準の Files メソッドを優先してください。