【JavaGold勉強記#9】Filesクラス編

JavaGold資格取得に向けた勉強記第9回は「Filesクラス」についてです。

ここではJavaGold資格取得に向けて勉強している駆け出しプログラマーの私がアウトプットの意味も込めて、「Filesクラス」について紹介させていただきます。

JavaGold資格取得に向けて勉強されている方や、プログラマー初心者の方にとって参考になれば幸いです!

FileクラスとFilesクラス

Javaにおいて、ファイルとディレクトリを扱うためのクラスとして、java.io.Filejava.nio.file.Filesが存在します。これらのクラスは、ファイル処理の異なる側面に焦点を当てており、それぞれに独自の特徴があります。

java.io.File

java.io.Fileクラスは、Java 1.0から存在しており、古いI/O(Input/Output)APIを提供しています。このクラスは以下のような特徴を持っています

  • パスの表現: 文字列としてのファイルパスを扱います。
  • ファイルおよびディレクトリ操作: ファイルやディレクトリの作成、削除、リネームなどの基本的なファイル操作がサポートされています。
  • I/O操作の実行: ファイルやディレクトリの読み書き、ストリームの取得など、I/O操作を行うメソッドが提供されています。

java.io.Fileについてはこちらの記事にまとめていますので、合わせてチェックしてください!

java.nio.file.Files

java.nio.file.Filesクラスは、Java 7で導入されたNIO.2 APIに属しています。このクラスは、新しいI/O APIを提供し、より柔軟で効率的なファイル処理が可能です。

  • Pathクラスの使用: ファイルパスを表現するためにPathクラスが導入され、Filesクラスのメソッドは主にPathを受け入れます。
  • Stream APIの統合: java.util.stream.Stream APIとの統合が図られており、集約操作やフィルタリングが容易に行えます。
  • 大規模なファイル処理: 非同期ファイルI/O、ファイルのウォッチングなど、大規模で高度なファイル処理がサポートされています。

Filesクラスのメソッド

java.io.Fileクラスの機能の1つに、ディレクトリ内のファイルやディレクトリの一覧を戻すlistFilesメソッドがあります。

このメソッドを使うと、単純にすべてのディレクトリ内の要素を戻したり、java.io.FileFilterを使って絞り込みをした結果を戻すということができました。

しかし、java.nio.file.Filesクラスを使えばもっと簡単に記述することができます

次のコード例では、Filesクラスのlistメソッド、walkメソッド、findメソッドを使い、srcというディレクトリ内の要素を扱っています。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.function.BiPredicate;

public class javaGold {
    public static void main(String[] args) throws Exception {
        Path base = Paths.get(".");
        Files.list(base).forEach(System.out::println);

        System.out.println("---");
        Files
                .walk(base.resolve("src"))
                .forEach(System.out::print);

        System.out.println("---");
        BiPredicate<Path, BasicFileAttributes> bp = (p, attr) -> {
            return p.toFile().getName().endsWith(".jpg");
        };
        Files
                .find(base, 3, bp)
                .forEach(System.out::println);
    }
}

listメソッド

ディレクトリ内のすべてのパスを取得する際に使用するメソッドです。

引数で渡されたディレクトリ内のディレクトリやファイルを表すPathオブジェクトの一覧をStreamオブジェクトとして戻します。

ただし、引数で渡したディレクトリの中にさらにサブディレクトリがあっても、その中まで取得することはできません。

walkメソッド

サブディレクトリまで展開したい場合は、walkメソッドを使います。

先ほどのコード例では、カレントディレクトリ直下にある「src」ディレクトリ内を再帰的に展開しています。

findメソッド

wallkメソッドでは、すべてのファイルとディレクトリを扱っていましたが、そうではなく指定したディレクトリ内のサブディレクトリまで再帰的に処理しつつ、必要なものだけに絞り込みたい場合には、findメソッドを使います。

先ほどのコード例では、findメソッドの引数にカレントディレクトリへのパスを持つPathと、再帰的に処理するディレクトリの深さ、そして絞り込み条件を渡しています。

絞り込み条件を指定するには、java.util.functon.BiPredicate型のラムダ式を使います。

walkFileTreeメソッド

指定されたディレクトリ内を再帰的に移動しながら、次の4つのタイミングで処理を実行するメソッドです。

  1. ディレクトリに入るとき
  2. ディレクトリから出るとき
  3. ファイルに遭遇したとき
  4. ファイルの処理に失敗したとき

これらのタイミングに、どのような処理をすべきかを規定するのが、java.nio.file.FileVisitorインタフェースです。

このインタフェースには、前述のタイミングに合わせて、次の4つの抽象メソッドが用意されています。

タイミング抽象メソッド
1.preVisitDirectory(T dir, BasicFileAttributes attrs)
2.postVisitDirectory(T dir, IOException exc)
3.visitFile(T file, BasicFileAttributes attrs)
4.visitFileFailed(T file, IOException exc)

最後に

今回は、Filesクラスについてまとめてみました。

java.nio.file.Filesクラスは、JavaのNIO.2 APIにおけるファイル処理において強力なツールとなっています。このクラスは、ファイルやディレクトリに対する操作を行うための多彩なメソッドを提供しており、効率的で柔軟なファイル処理が可能です。

これはあくまでFilesクラスの基本的な機能の紹介ですので、詳細な使用法やオプションは公式ドキュメントや関連するリソースを参照してください!