Java

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

勉強ちゃん

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

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

1 読み込み FileReader, BufferedReader

2 書き込み FileWriter, BufferedWriter

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


    読み込み 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をコピーしました