JavaGold資格取得に向けた勉強記第9回は「Filesクラス」についてです。
ここではJavaGold資格取得に向けて勉強している駆け出しプログラマーの私がアウトプットの意味も込めて、「Filesクラス」について紹介させていただきます。
JavaGold資格取得に向けて勉強されている方や、プログラマー初心者の方にとって参考になれば幸いです!
FileクラスとFilesクラス
Javaにおいて、ファイルとディレクトリを扱うためのクラスとして、java.io.File
とjava.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つのタイミングで処理を実行するメソッドです。
- ディレクトリに入るとき
- ディレクトリから出るとき
- ファイルに遭遇したとき
- ファイルの処理に失敗したとき
これらのタイミングに、どのような処理をすべきかを規定するのが、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クラスの基本的な機能の紹介ですので、詳細な使用法やオプションは公式ドキュメントや関連するリソースを参照してください!