Java

Javaファイル操作について 読み込み・書き込み

勉強ちゃん

Java では、ファイルの読み込みや書き込みを簡単に実現できるクラスが標準ライブラリとして提供されています。
今回は以下の内容を詳しく解説します。

  • ファイル読み込み:FileReader と BufferedReader
  • ファイル書き込み:FileWriter と BufferedWriter
  • 実践例:商品単価情報を読み込み、商品の情報、合計金額をファイルに出力

読み込み FileReader, BufferedReader

FileReader

FileReader は、テキストファイルを文字単位で読み込むためのクラスです。
シンプルに1文字ずつ読み込みます。

サンプル

import java.io.FileReader;
import java.io.IOException;
public class TestFileReader {
    public static void main(String[] args) {
        try (FileReader fr = new FileReader("productUnitPrice")) {
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ファイル productUnitPrice

リンゴ,100
バナナ,200
寿司,1000

出力結果:

リンゴ,100
バナナ,200
寿司,1000

このコードでは ファイル productUnitPrice の内容を1文字ずつ読み込んで標準出力に表示しています。

注意点

  • 大きなファイルには非効率:1文字ずつ読み込むため、行単位で処理する場合は BufferedReader を使う方が効率的。
  • 文字コード指定不可:デフォルトの文字コードが使われるため、UTF-8 などを指定したい場合は InputStreamReader を併用します。

BufferedReader

BufferedReader は、ファイルを効率的に読み込むためのクラスで、行単位の処理が可能です。

サンプル

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TestBufferedReader {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("productUnitPrice"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ファイル productUnitPrice

リンゴ,100
バナナ,200
寿司,1000

出力結果:

リンゴ,100
バナナ,200
寿司,1000

このコードでは1行ずつ読み込み、標準出力に表示します。

注意点

  • 読み込むのは「1行単位」なので、改行文字は自動的に取り除かれます。
  • バッファを利用しているため、大きなファイルも効率よく処理可能。

書き込み FileWriter, BufferedWriter

FileWriter

FileWriter は文字単位でファイルに書き込むためのクラスです。

サンプル

import java.io.FileWriter;
import java.io.IOException;

public class TestFileWriter {
  public static void main(String[] args) {
        try (FileWriter fw = new FileWriter("productInfo")) {
            fw.write("リンゴ 数量:2  単価:100 合計: 200円\n");
            fw.write("バナナ 数量:2  単価:200 合計: 400円");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

出力結果(ファイル productInfo

リンゴ 数量:2  単価:100 合計: 200円
バナナ 数量:2  単価:200 合計: 400円

注意点

  • デフォルトでは上書きモード
    追記モードをしたい場合はコンストラクタに true を渡します。
    new FileWriter(“productInfo”, true);
  • 文字コードを指定したい場合は OutputStreamWriter を使います。

BufferedWriter

BufferedWriter はバッファを使って効率的に文字列を書き込めます。FileWriter と組み合わせて使います。

サンプル


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class TestBufferedWriter {
  public static void main(String[] args) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("productInfo"))) {
            bw.write("new");
            bw.newLine(); // 改行
            bw.write("リンゴ 数量:2  単価:100 合計: 200円");
            bw.newLine(); // 改行
            bw.write("バナナ 数量:2  単価:200 合計: 400円");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

出力結果(ファイル productInfo

new
リンゴ 数量:2  単価:100 合計: 200円
バナナ 数量:2  単価:200 合計: 400円

注意点

  • newLine() メソッドで改行を挿入できます。
  • バッファを使うので大量データも高速に書き込めます。

練習:買い物の合計の続き

最後に、これまでの知識を使って小さな実践例を作ってみましょう。

  • 商品単価は productUnitPriceから読み込む
  • 商品名と数量はユーザー入力
  • 合計金額を productInfo に保存

productUnitPrice(例)

リンゴ,100
バナナ,200
寿司,1000

コード例


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Test {
  public static void main(String[] args) {
        Map<String, Integer> priceMap = new HashMap<>();
        List<String> productInfoList = new ArrayList<String>();
        int allTotal = 0;

        // 商品単価をファイルから読み込む
        try (BufferedReader br = new BufferedReader(new FileReader("productUnitPrice"))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] data = line.split(",");
                priceMap.put(data[0], Integer.parseInt(data[1]));
            }
        } catch (IOException e) {
            System.out.println("価格ファイルの読み込みエラー: " + e.getMessage());
            return;
        }

        // ユーザー入力
        try(Scanner sc = new Scanner(System.in)){
            while (true) {
                System.out.println("商品名を入力してください「すべで入力済の場合、「end」を入力してください」:");
                 String productName = sc.nextLine();
                if ("end".equals(productName)) {
                    break;
                }
                if (!priceMap.containsKey(productName)) {
                    System.out.println("指定された商品は存在しません。");
                    continue;
                }
                System.out.print("数量を入力してください: ");
                int quantity = sc.nextInt();
                sc.nextLine(); // 改行の読み飛ばし
                int price = priceMap.get(productName);
                int total = price * quantity;
                allTotal = allTotal + total;
                productInfoList.add(productName + "\t" + quantity + "\t" + total + "円");
            }
        }

        // 結果をファイルに書き込む
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("productInfo", true))) {
            for(String product : productInfoList){
                bw.write(product);
                bw.newLine();
            }
            bw.write("合計金額:" + allTotal);
        } catch (IOException e) {
            System.out.println("結果ファイルの書き込みエラー: " + e.getMessage());
        }

        System.out.println("計算結果をproductInfoに保存しました。");
    }
}

実行例

商品名を入力してください「すべで入力済の場合、「end」を入力してください」:
リンゴ
数量を入力してください: 20
商品名を入力してください「すべで入力済の場合、「end」を入力してください」:
バナナ
数量を入力してください: 10
商品名を入力してください「すべで入力済の場合、「end」を入力してください」:
寿司
数量を入力してください: 1
商品名を入力してください「すべで入力済の場合、「end」を入力してください」:
end
計算結果をproductInfoに保存しました。

productInfo(出力例)

リンゴ 20 2000円
バナナ 10 2000円
寿司 1 1000円
合計金額:5000


まとめ

  • FileReader / BufferedReader でファイルを読み込む
  • FileWriter / BufferedWriter でファイルに書き込む
  • 実践例として、ファイルからデータを読み込み、計算結果をファイルに保存する方法を学んだ

次回予告:

**「Javaのクラスとオブジェクト」**を使って、商品管理をさらに効率的にする方法を解説します。お楽しみに!

ABOUT ME
自己紹介
自己紹介
職業:Web開発エンジニア
こんにちは!
このブログでは、ITのお仕事で学んだ知識や、 日本での生活で学んだ知識を紹介しています。
お役に立てればうれしいです 😊
記事URLをコピーしました