Javaのファイル入出力|NIO・Files・try-with-resources
java.nio.fileのPath/Files、テキストファイルの読み書き、BufferedReader、try-with-resources、文字コードの注意点と失敗例を学びます。
結論:ファイルI/OはPath+Files(NIO.2)とtry-with-resourcesで安全に読み書きする
現代のJavaでは java.nio.file の Path と Files を使うのが標準です。ストリームは必ずcloseが必要なため、try-with-resourcesで自動解放します。
ファイルの読み込み
import java.nio.file.*;
import java.util.List;
Path path = Path.of("data", "input.txt");
List<String> lines = Files.readAllLines(path);
// または
String content = Files.readString(path);
ファイルの書き込み
Path out = Path.of("output", "result.txt");
Files.createDirectories(out.getParent());
Files.writeString(out, "Hello, File IO!");
BufferedReader(大きなファイル)
try (var reader = Files.newBufferedReader(path)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
失敗例:相対パスの勘違い
実行時のカレントディレクトリ基準です。IDEとターミナルでcwdが異なると FileNotFoundException になります。絶対パスや Paths.get(System.getProperty("user.dir")) で確認しましょう。
失敗例:文字コード未指定
Windowsのデフォルト(MS932)とUTF-8の不一致で文字化けします。明示的に StandardCharsets.UTF_8 を指定します。
まとめ
Files APIとtry-with-resourcesがファイルI/Oの基本形です。パス・文字コード・ディレクトリ存在確認は実行環境でハマりやすいポイントです。次回はソケット通信に進みます。
まとめ
Javaのファイル入出力はPath/Filesとtry-with-resourcesで実装します。相対パスの基準ディレクトリとUTF-8指定を忘れるとFileNotFoundExceptionや文字化けが起きます。小さなテキストファイルの読み書きをCLIで試しましょう。
次にやること
input.txt を読み、行数と文字数を数えて stats.txt に書き出すプログラムをFiles APIで作ってください。
よくある質問
File と Path の違いは?
レガシーのjava.io.Fileに対し、PathはNIO.2のモダンAPI。新規コードはPath/Files推奨です。
バイナリファイルは?
Files.readAllBytes / write でバイト列として扱います。
追記モードは?
Files.write(path, bytes, StandardOpenOption.APPEND) 等を使います。
ディレクトリ走査は?
Files.walk や Files.list でStream<Path>として処理できます(後のStream回と連携)。
権限エラーは?
AccessDeniedException。Unix系ではパーミッション、Windowsでは読み取り専用属性を確認します。
次に読むべき記事
同カテゴリ「プログラミング」の記事
人気記事
- TS2307: Cannot find module '@components/Widget601' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget591' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget581' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget571' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget561' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget551' or its corresponding type declarations の原因と解決法
学習ルート
体系的に学びたい方はこちらから。
エラー解決コース →あわせて読みたい
- Javaの例外処理IOExceptionの扱い
- Javaのネットワークプログラミング同じ講座の次の回
- JavaのStream APIFiles.walkとStream
- Javaのスレッドプログラミング非同期I/Oの前提
- Javaのプロジェクト開発プロジェクト内のパス