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
(例)
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のクラスとオブジェクト」**を使って、商品管理をさらに効率的にする方法を解説します。お楽しみに!