Java

ファイル入出力

データをプログラム終了後にも残し、安全に読み書きする方法を学びます。

01

Pathで場所を表す

Pathはファイルやフォルダーの場所を表します。相対パスは実行時の作業フォルダーを基準にします。

PathExample.javaJAVA
import java.nio.file.Path;

public class PathExample {
    public static void main(String[] args) {
        Path path = Path.of("data", "message.txt");
        System.out.println(path);
        System.out.println(path.toAbsolutePath());
    }
}
実行例OUTPUT
data/message.txt
/home/user/project/data/message.txt

絶対パスは環境ごとに異なります。固定の文字列で区切り記号をつなげず、Path.of()を使います。

02

テキストを保存して読む

親フォルダーを作り、UTF-8で保存してから読み込みます。Java 18以降ではこれらのメソッドの既定文字コードもUTF-8ですが、意図を明確にするため指定します。

TextFile.javaJAVA
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

public class TextFile {
    public static void main(String[] args) throws IOException {
        Path path = Path.of("data", "message.txt");
        Files.createDirectories(path.getParent());
        Files.writeString(path, "Javaを勉強中です。\n", StandardCharsets.UTF_8);
        String content = Files.readString(path, StandardCharsets.UTF_8);
        System.out.print(content);
    }
}
実行結果OUTPUT
Javaを勉強中です。
上書きに注意 writeString()は既存内容を置き換えます。重要なファイルではなく練習用フォルダーで試します。
03

末尾へ追記する

StandardOpenOption.APPENDで既存内容の末尾へ加えます。ファイルがない場合にも作れるようCREATEを併用します。

追記JAVA
Files.writeString(
    Path.of("data", "log.txt"),
    "学習を開始しました。\n",
    StandardCharsets.UTF_8,
    StandardOpenOption.CREATE,
    StandardOpenOption.APPEND
);
System.out.print(Files.readString(Path.of("data", "log.txt")));
初回の実行結果OUTPUT
学習を開始しました。

実行するたびに1行増えます。java.nio.file.StandardOpenOptionをインポートしてください。

04

CSVを読み込む

引用符や値内のカンマを含まない単純な練習用CSVなら、行ごとに読み、最初のカンマで分けられます。

products.csvCSV
りんご,120
みかん,80
読込処理JAVA
for (String line : Files.readAllLines(Path.of("products.csv"))) {
    String[] columns = line.split(",", 2);
    String name = columns[0];
    int price = Integer.parseInt(columns[1]);
    System.out.println(name + ": " + price + "円");
}
実行結果OUTPUT
りんご: 120円
みかん: 80円
実務のCSV 値にカンマ、改行、引用符が入るCSVは単純なsplit()では正しく読めません。検証済みのCSVライブラリを使い、列数や数値形式も確認します。
PRACTICE

ミニ課題:買い物メモ

商品名を1行ずつshopping.txtへ保存し、読み込んで番号付きで表示してください。ファイルがない初回は空の一覧として扱いましょう。

確認項目
  • Files.exists()で存在を確認する
  • UTF-8を明示する
  • 既存ファイルを上書きするか追記するか決める
  • IOExceptionを呼び出し側へ渡すか処理する