【Java】テキストファイルの読み込みと書き込み

2018年7月6日

本稿は、テキストファイルの入出力について説明します。

ゲーム制作において、セーブデータを作成したいのであれば、必要な知識となります。

テキストファイルを一行ずつ読み込み

FileReaderクラスを利用するとテキストファイルを読み込むことができます。

さらにBufferedReaderでラップすることによって、効率的に読み込み処理ができます。

実際にテキストファイルを作成し、一行ずつ内容を表示してみましょう。

以下のテキストファイルを作成しました。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test {
	public static void main(String[] args) {
		try(FileReader fr = new FileReader("test.txt");
			BufferedReader br = new BufferedReader(fr)){

			String str = null;
			str = br.readLine();
			while(str!=null) {
				System.out.println(str);
				str = br.readLine();
			}
		} catch ( IOException e ) {
			e.printStackTrace();
		}
	}
}
実行結果

私は三番目につよいモグラです。
真のNo3の強さを見せてあげましょう。

readLineメソッドは改行区切りで文字列を読み込んでくれます。

読み込む文字がなくなるとnullを返すため、null以外の間処理をするようにしています。

処理後はreaderのcloseメソッドを呼ばなければなりません。

このサンプルでは、try-with-resource構文を利用し、closeメソッドが自動的に呼び出されるようにしています。

Scannerでテキストファイルを一行ずつ読み込み

機能が豊富なScannerクラスを使って文字列の読み込みを行います。

まずは、読み込むファイルを作成しましょう。

test.txtファイルを作成してみましょう。

ファイルの中身は好きなように文字列を記述しておきましょう。

Scannerクラスを利用するにはまず、Fileクラスのオブジェクトを作成しなければなりません。

次にScannerクラスをインスタンス化し、Fileオブジェクトをコンストラクタに指定すれば準備完了。

1行ずつテキストを読み込むにはnextLineメソッドを利用します。

それでは、サンプルをご覧ください。

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class Test{
	public static void main(String[] args){
		//test.txtファイルのパスを設定
		File f = new File("test.txt");

		//closeメソッドは自動呼び出しの対象とする。
		try(Scanner sc = new Scanner(f)){
			
			//hasNextLineで次の行が存在するかを判定します。
			while(sc.hasNextLine()){
				
				//次の行を読み込み
				String str = sc.nextLine();
					
				System.out.println(str);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}
実行結果

昔々、あるところにおじいさんとおばあさんがいました。
おじいさんは山へ旅に出ました。
おしまい。

Scannerは使用後、必ずcloseメソッドを呼び出さなければなりません。

今回もtry-with-resource構文を利用し、closeメソッドが自動的に呼び出されるようにしています。

テキストファイルをカンマ区切りで読み込み

Scannerクラスには他にもいろいろな機能があり、useDelimiterメソッドで区切り文字の指定やnextIntメソッドなどで、数値型として読み込めるような機能が付いています。

せっかくなので、実際にキャラクタのステータスをカンマ区切りで保存した前提で、ファイルを読み込むサンプルも紹介します。

さきほどのtest.txtファイルの中身を「名前,HP,MP」のように書き換えます。

3キャラ分用意しました。

test.txt

カンマ区切りで読み込むプログラムを用意します。

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class Test{
	public static void main(String[] args){
		//test.txtファイルのパスを設定
		File f = new File("test.txt");

		//closeメソッドは自動呼び出しの対象とする。
		try(Scanner sc = new Scanner(f)){
			
			sc.useDelimiter(",");
			
			//hasNextLineで次の行が存在するかを判定します。
			while(sc.hasNextLine()){
				
				String name = sc.next();
				int hp = sc.nextInt();
				int mp = sc.nextInt();
					
				System.out.println("名前:"+name);
				System.out.println("HP:"+hp);
				System.out.println("MP:"+mp);
				System.out.println();
				
				sc.nextLine();//次の行へ
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}
実行結果

名前:ののぽん
HP:100
MP:50

名前:勇者
HP:150
MP:30

名前:魔法使い
HP:30
MP:100

期待通りにステータスが読み込めましたね。

テキストファイルの書き込み

ファイルの書き込みは、FileWriterを利用することで実現できます。

さらに、BufferedWriterと一緒に利用することによって効率よく書き込み処理を実行できます。

writeメソッドを呼び出すと文字列をファイルに書き込み、closeメソッドで書き込み処理を完了できます。

closeメソッドを呼び出し忘れるとファイルにうまく書き込めないので必ず最後に呼び出してあげましょう。

closeメソッドは自動で呼び出されるように、try-with-resourceを使用します。

それでは、サンプルをご覧ください。

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

public class Test{
	public static void main(String[] args){
		//書き出しパス名の指定
		File f = new File("out.txt");
		
		//完了後に自動でcloseを呼び出しする対象とする
		try(BufferedWriter bw = new BufferedWriter(new FileWriter(f))){
			
			bw.write("こんにちわ。");
			bw.newLine();//OSデフォルトの改行を挿入
			bw.write("そして、グッドバイ");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
実行結果

新しいファイルが作成されました。

ファイルの中身

これで簡易的なセーブファイルなら作成ができますね。

テキストファイルに追記

上記の方法は毎回ファイルの上書き保存となってしまいます。

特に使用することもないかもしれませんが、ファイルに文字列の追記をする方法もついでに紹介しておきます。

ファイルへの追記はFileReaderのコンストラクタの第二引数にtrueを渡すだけです。

それでは、先ほど作成したグッドバイの後に文字列を追記します。

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

public class Test{
	public static void main(String[] args){
		//追記したいファイルを指定
		File f = new File("out.txt");
		try(BufferedWriter bw = new BufferedWriter(new FileWriter(f,true))){
			bw.newLine();
			bw.write("わしの金歯を見てくれや。");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
実行結果

ファイルの中身