Java | Java 標準ライブラリ:File クラス

Java Java
スポンサーリンク

File クラスをざっくり一言でいうと

java.io.File は、

ディスク上の “ファイル or ディレクトリ” を指し示すための “住所カード”

です。

ここがとても大事で、
File 自体は「中身を読んだり書いたりするクラス」ではありません。

「どこにある何という名前のファイル(かディレクトリ)なのか」を表すだけ。
実際の読み書きは、FileInputStreamFileReaderFiles クラスなど別のクラスが担当します。

まずは「File = 住所情報」「IO = 実際の読み書き」と頭を分けておくと、かなり整理されます。


File の基本:パスを指定して「場所」を表す

コンストラクタでパスを渡す

一番基本の使い方は、
「文字列のパスを File に渡して、その場所を表すオブジェクトを作る」です。

import java.io.File;

public class FileBasic {
    public static void main(String[] args) {
        File f1 = new File("data.txt");              // 相対パス
        File f2 = new File("C:\\temp\\data.txt");    // Windows 風の絶対パス
        File f3 = new File("/home/user/data.txt");   // Unix 風の絶対パス

        System.out.println(f1.getPath());
        System.out.println(f2.getPath());
        System.out.println(f3.getPath());
    }
}
Java

ここで作っているのは、あくまで

「このパスを指していますよ」

というオブジェクトです。

そのパスに実際にファイルが存在するかどうかは、
まだ確認していません。

File が表すのは「ファイル」か「ディレクトリ」か

File は、ファイルとディレクトリの両方を表現できます。

File dir = new File("logs");          // ディレクトリかもしれない
File file = new File("logs/app.log"); // ファイルかもしれない
Java

それが実際に「ファイル」なのか「ディレクトリ」なのかは、
isFile() / isDirectory() で判定します(後で説明します)。


File でよく使う基本メソッド(存在確認・種別・サイズ)

ファイルやディレクトリが存在するかを調べる

これ、実務でもかなりよく使います。

import java.io.File;

public class FileExists {
    public static void main(String[] args) {
        File f = new File("data.txt");

        if (f.exists()) {
            System.out.println("存在します");
        } else {
            System.out.println("存在しません");
        }
    }
}
Java

exists() は、そのパスに何か(ファイルまたはディレクトリ)が存在すれば true です。

「存在しないファイルに書き込みたいのか」
「存在するファイルを上書きするのか」

という分岐で、最初に押さえておくべきメソッドです。

ファイルなのかディレクトリなのかを判定する

import java.io.File;

public class FileTypeCheck {
    public static void main(String[] args) {
        File f1 = new File("data.txt");
        File f2 = new File("logs");

        System.out.println("f1 isFile: " + f1.isFile());
        System.out.println("f1 isDirectory: " + f1.isDirectory());

        System.out.println("f2 isFile: " + f2.isFile());
        System.out.println("f2 isDirectory: " + f2.isDirectory());
    }
}
Java

注意してほしいのは、
exists() が false の場合は、isFile() / isDirectory() も false になります。

つまり、「存在しないパス」は、ファイルでもディレクトリでもない、という扱いです。

ファイルサイズの取得(バイト単位)

import java.io.File;

public class FileLength {
    public static void main(String[] args) {
        File f = new File("data.txt");

        if (f.exists() && f.isFile()) {
            long size = f.length(); // バイト数
            System.out.println("サイズ: " + size + " bytes");
        }
    }
}
Java

length() は、ファイルのバイト数を返します。
ディレクトリに対して呼ぶと、意味のない値になることが多いので、
isFile() を確認してから使うのが安全です。


パス情報の取得:絶対パス・親ディレクトリ・ファイル名

絶対パスを取得する

new File("data.txt") のように相対パスで作ると、
そのファイルが実際にどこを指しているのか分かりづらいですよね。

getAbsolutePath() で、
「今の作業ディレクトリから見た絶対パス」を知ることができます。

File f = new File("data.txt");
System.out.println(f.getAbsolutePath());
Java

デバッグ時に、「そもそもどのパスのファイルを見に行っているのか?」を確認するのに、めちゃくちゃ役立ちます。

ファイル名・親ディレクトリを取得する

import java.io.File;

public class FileNameAndParent {
    public static void main(String[] args) {
        File f = new File("logs/app.log");

        System.out.println("パス      : " + f.getPath());        // logs/app.log
        System.out.println("名前      : " + f.getName());        // app.log
        System.out.println("親ディレクトリ: " + f.getParent()); // logs

        File parent = f.getParentFile(); // 親をFileとして取得
        System.out.println("親の絶対パス: " + parent.getAbsolutePath());
    }
}
Java

ログファイルの出力ディレクトリを作るときなど、
「親ディレクトリを触りたい」場面が多いので、getParent()getParentFile() は地味に重要です。


ディレクトリの中身を列挙する(ファイル一覧取得)

listFiles で中身の File 配列をもらう

ディレクトリ内のファイル一覧を表示してみます。

import java.io.File;

public class ListFilesExample {
    public static void main(String[] args) {
        File dir = new File("logs");

        if (dir.exists() && dir.isDirectory()) {
            File[] children = dir.listFiles();
            if (children != null) {
                for (File child : children) {
                    System.out.println(child.getName());
                }
            }
        } else {
            System.out.println("logs ディレクトリが存在しません");
        }
    }
}
Java

listFiles() は、そのディレクトリ直下にあるファイルやサブディレクトリを
File[] として返してくれます。

ここでの注意点として、

戻り値が null の場合もある(I/O エラーやアクセス権の問題など)
ので、children != null をチェックしてからループするのが安全です。

サブディレクトリの中まで再帰的に見に行くこともできますが、
初心者のうちは「一階層だけ」の列挙にまず慣れておくとよいです。


ファイル・ディレクトリの作成、削除、名前変更

空のファイルを作る(createNewFile)

import java.io.File;
import java.io.IOException;

public class CreateFileExample {
    public static void main(String[] args) throws IOException {
        File f = new File("newfile.txt");

        if (f.createNewFile()) {
            System.out.println("ファイルを作成しました");
        } else {
            System.out.println("ファイルはすでに存在しています");
        }
    }
}
Java

createNewFile() は、

ファイルがなければ空ファイルを作る
ファイルがすでにあれば何もしないで false を返す

という挙動です。

「まず空ファイルだけ作っておきたい」というときに使えますが、
最近は Files.writeString などで直接書き込んでしまうことも多いです。

ディレクトリを作る(mkdir / mkdirs)

import java.io.File;

public class CreateDirExample {
    public static void main(String[] args) {
        File dir = new File("logs/2025/01");

        boolean ok1 = dir.mkdir();   // 最後の1階層だけ作成(親が無いと失敗しやすい)
        System.out.println("mkdir: " + ok1);

        boolean ok2 = dir.mkdirs();  // 必要な親ディレクトリもまとめて作成
        System.out.println("mkdirs: " + ok2);
    }
}
Java

mkdir() は「自分自身のディレクトリだけ作る」ので、
親ディレクトリが存在しないと失敗します。

mkdirs() は「足りない親ディレクトリも含めて全部作る」ので、
一気に深い階層を作りたいときによく使われます。

削除(delete)と注意点

import java.io.File;

public class DeleteExample {
    public static void main(String[] args) {
        File f = new File("old.txt");

        if (f.delete()) {
            System.out.println("削除しました");
        } else {
            System.out.println("削除できませんでした");
        }
    }
}
Java

delete() は、成功すれば true。
失敗(権限がない、ロックされている、ディレクトリが空でない…など)の場合は false です。

ここで特に重要なのが、

空でないディレクトリは delete できない

という点です。
中身ごとガッツリ消したい場合は、自分で再帰的に中身を全部消してからディレクトリを消す必要があります。

初心者のうちは、まず「単一ファイルの削除」だけを慎重に扱う方が安全です。

名前変更・移動(renameTo)

import java.io.File;

public class RenameExample {
    public static void main(String[] args) {
        File oldFile = new File("old.txt");
        File newFile = new File("new.txt");

        if (oldFile.renameTo(newFile)) {
            System.out.println("名前変更(または移動)に成功");
        } else {
            System.out.println("失敗しました");
        }
    }
}
Java

renameTo は、
「同じディレクトリでファイル名を変える」だけでなく、
「別ディレクトリへファイルを移動する」ことにも使えます。

ただし、OS やファイルシステムによって成功条件が微妙に違うこともあり、
java.nio.file.Files.move の方が挙動がはっきりしていておすすめです。


File 自体では「中身を読まない」という感覚を固める

FileInputStream や FileReader とセットで使う

もう一度強調しますが、File はあくまで「住所」です。

実際の読み書きは、別のクラスを組み合わせます。

import java.io.*;

public class ReadWithFile {
    public static void main(String[] args) {
        File f = new File("data.txt");

        try (BufferedReader reader = new BufferedReader(new FileReader(f))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Java

new FileReader(f) のように、File を渡して「このパスのファイルを読むストリーム」を作ります。

逆に、書き込みなら new FileWriter(file) だったり、
バイナリなら new FileInputStream(file) / new FileOutputStream(file) だったりします。

File はあくまで「ここを開いてね」と指し示すだけ。
開いて、読み書きするのはストリームの仕事、という分担です。

新しい API(Path / Files)との位置づけ

Java 7 以降は、java.nio.file.PathFiles が登場し、
File の役割の多くを置き換えています。

たとえば、

File の exists()Files.exists(path)
File の delete()Files.delete(path)
File の listFiles()Files.list(path)(Stream)

などです。

新規コードでは Path / Files を使うのがおすすめですが、
既存ライブラリや書籍では File がまだ大量に出てくるので、
「File とは何か」を理解しておく意味は大きいです。


まとめ:File クラスを自分の中でこう位置づける

java.io.File を初心者向けに一言でまとめると、

「ディスク上のファイルやディレクトリの “場所” と “基本情報” を扱う、住所カード的クラス」

です。

特に意識しておきたいのは、

  • File は中身を読まない。存在確認・種別判定・パス情報取得・作成・削除・名前変更が主な役割
  • exists() / isFile() / isDirectory() あたりが基本の三種の神器
  • 絶対パス(getAbsolutePath())やファイル名(getName())、親ディレクトリ(getParent())をよく使う
  • ディレクトリの中身は listFiles() で一覧取得できる
  • 実際の読み書きは、FileReader / FileInputStream などの “ストリーム系クラス” で行う

タイトルとURLをコピーしました