1. はじめに
プログラミングでは、ほとんど常にファイルを扱う必要があります。誰にでも身近な例としては、メモのテキストの保存、ゲームの進行状況の保存、画像のコピー、設定を構成ファイルから読み込むことなどがあります。
Java にはそのためのモダンで便利な道具があります。パッケージ java.nio.file の Path と Files を使えば、数行のコードでファイルを開き、中身を読み取り、テキストを書き込み、画像をコピーすることさえできます。
ファイルへのパス (Path)
ファイルは常にどこかのディスク上にあり、それにアクセスするにはパスを指定する必要があります。そのために Java には Path クラスがあり、新しいオブジェクトは Path.of() メソッドで作成できます。
Path path = Path.of("hello.txt"); // 相対パス
Path absPath = Path.of("C:/Users/Me/image.png"); // 絶対パス (Windows)
補足:
- 相対パスは現在のプロジェクトのフォルダ内でファイルを探します (例えば "hello.txt")。
- 絶対パスはディスク、フォルダ、ファイル名まで含む完全なアドレスを指定します。
2. テキストファイルの操作
Java の観点ではファイルは 2 種類に分けられます。内容を人が読めるテキストとして表せるものはテキストファイル、それ以外は単なるバイトの集合 (バイナリファイル) です。
テキストを書き込む — writeString
文字列をファイルに書き込むには、writeString メソッドを使います。
Path p = Path.of("hello.txt");
Files.writeString(p, "こんにちは、ファイル!");
ここで行っていること:
- "hello.txt" を指す Path オブジェクトを作成します。
- writeString メソッドで文字列を書き込みます。
- ファイルが存在しない場合は自動的に作成されます.
この方法でメモやメッセージを簡単にテキストファイルへ保存できます。
テキストを読み込む — readString
readString メソッドは、ファイル全体を一度に文字列として読み込めます。
Path p = Path.of("hello.txt");
String content = Files.readString(p);
System.out.println(content);
変数 content にファイルの内容が入ります。設定ファイルやテキスト、JSON ドキュメントなどの小さなファイルに便利です。
3. バイナリファイルの操作
すべてのファイルがテキストでできているわけではありません。画像、音楽、アーカイブはバイトの集合です。これらを扱うには write と readAllBytes メソッドを使います。
バイトを書き込む — write
write() メソッドは、バイト配列をファイルに書き込めます。これはバッファ (byte buffer) とも呼ばれます。
byte[] data = {65, 66, 67, 68}; // 文字 A B C D
Files.write(Path.of("letters.bin"), data);
ここではバイト配列をファイルに書き込みました。ファイルをテキストとして開くと、中身は "ABCD" の文字になります。
バイトを読み込む — readAllBytes
ファイルの内容をバイト配列として取得するには、readAllBytes メソッドを使います。
byte[] buffer = Files.readAllBytes(Path.of("letters.bin"));
// 読み取ったバイト配列を画面に出力する
for (byte b : buffer)
{
System.out.print((char)b + " ");
}
画面出力:
A B C D
この方法は、画像、ドキュメント、音楽など、あらゆるバイナリファイルで使えます。
4. よくあるファイル操作のシナリオ
最も一般的なファイル操作は、おそらくファイルのコピーです。
ファイルのコピー
ファイルをコピーするには、単にその内容をバイト配列として読み取り、別のファイルに書き込みます。
Path in = Path.of("logo.png");
Path out = Path.of("logo_copy.png");
byte[] bytes = Files.readAllBytes(in);
Files.write(out, bytes);
このようにして、画像、ドキュメント、その他あらゆるファイルを、その形式を気にせずコピーできます。
存在確認とサイズ取得
ファイルが存在するか、サイズはどれくらいかを確認したい場合があります。そのために exists と size メソッドがあります。
Path p = Path.of("hello.txt");
if (Files.exists(p))
{
long size = Files.size(p);
System.out.println("ファイルが見つかりました。サイズ: " + size + " バイト");
}
else
{
System.out.println("ファイルが見つかりません!");
}
これは診断に役立ち、正しいファイルを扱っているかを確実に把握できます。
5. 例外
ファイル操作は、ファイルが存在しない、アクセス権がない、ディスクが満杯、別のプログラムが使用中などの理由で失敗することがあります。したがって、ディスク I/O は try-catch で囲むか、throws を使って例外を呼び出し元へ伝播させる必要があります。
try
{
String content = Files.readString(Path.of("hello.txt"));
System.out.println(content);
}
catch (IOException e)
{
System.out.println("読み取り時のエラー: " + e.getMessage());
}
こうしておけば、プログラムは「落ちる」ことなく、何が起きたかを丁寧にユーザーへ伝えられます。必要であれば、例外 IOException を、throws を付けたメソッドでさらに上位のスタックへスローすることもできます。
GO TO FULL VERSION