トッカンソフトウェア

テキストファイル

今回はテキストファイルの読み書きをやります。Jsp、サーブレットというよりJavaの内容ですが、Jsp、サーブレットでも
使う機会が多いと思われるので、別ジャンルかもしれませんがやります。


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

				
package test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

public class FileTest {
	public static void main(String[] args) {
		String dir = "C:\\work\\hp\\";

		// ファイル読み込みテスト
		List<String> ret = read(dir + "desktop.txt");
		System.out.println(ret);

		List<String> ret3 = read();
		write(ret3);

		// ファイル書き込みテスト
		write(dir + "new.txt", ret);

		// マップ変換
		LinkedHashMap<String, String> map = aryToMap(ret, "\t");
		map.put("aaa2", "bbb");
		List<String> ret2 = mapToAry(map, ",");
		write(dir + "new2.txt", ret2);

		// ファイル追記
		append(dir + "new2.txt", "new1");
		debuglog("xxx");
	}

	/**
	 * テキストファイル読み込み
	 * 
	 * @param path ファイルパス
	 * @return ファイルデータ
	 */
	public static List<String> read(String path) {
		ArrayList<String> ret = new ArrayList<>();

		try (BufferedReader br = new BufferedReader(new FileReader(path))) {
			String line;
			while ((line = br.readLine()) != null) {
				ret.add(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * ファイル書き込み
	 * 
	 * @param path ファイルパス
	 * @param ary ファイルデータ
	 */
	public static void write(String path, List<String> ary) {
		StringBuilder stb = new StringBuilder();
		for (String str : ary) {
			stb.append(str);
			stb.append(System.lineSeparator());
		}
		try (FileWriter filewriter = new FileWriter(path, false)) {
			filewriter.write(stb.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * ファイル追記
	 * 
	 * @param path ファイルパス
	 * @param str 追記テキスト
	 */
	public static void append(String path, String str) {
		try (FileWriter filewriter = new FileWriter(path, true)) {
			filewriter.write(str);
			filewriter.write(System.lineSeparator());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * リスト→マップ変換
	 * 
	 * @param ary 変換元リスト
	 * @param regex 区切り文字
	 * @return 変換先マップ
	 */
	public static LinkedHashMap<String, String> aryToMap(List<String> ary, String regex) {
		LinkedHashMap<String, String> ret = new LinkedHashMap<>();
		for (String str : ary) {
			String[] strs = str.split(regex);
			if (strs.length == 2) {
				ret.put(strs[0], strs[1]);
			}
		}

		return ret;
	}

	/**
	 * マップ→リスト変換
	 * 
	 * @param map 変換元マップ
	 * @param sep 区切り文字
	 * @return 変換先リスト
	 */
	public static ArrayList<String> mapToAry(LinkedHashMap<String, String> map, String sep) {
		ArrayList<String> ret = new ArrayList<>();
		for (String key : map.keySet()) {
			ret.add(key + sep + map.get(key));
		}
		return ret;
	}

	/** ログフォルダパス */
	public static final String LOG_PATH = "C:\\debug\\";

	/**
	 * デバッグログ出力
	 * 
	 * @param str 出力内容
	 */
	public static void debuglog(String str) {
		Date date = new Date();
		SimpleDateFormat sdfFile = new SimpleDateFormat("yyyyMMdd");
		SimpleDateFormat sdfText = new SimpleDateFormat("HHmmss");
		File dir = new File(LOG_PATH);
		if (!dir.isDirectory()) {
			dir.mkdir();
		}
		append(LOG_PATH + "log" + sdfFile.format(date) + ".txt", sdfText.format(date) + "\t" + str);
	}

	/** データファイルパス */
	public static final String DATA_PATH = "C:\\debug\\data.txt";

	/** 区切り文字 */
	public static final String SEP = "\t";

	/**
	 * データファイルよりデータ読み込み
	 * 
	 * @return 読み込みデータ
	 */
	public static List<String> read() {
		return read(DATA_PATH);
	}

	/**
	 * データファイルに書き込み
	 * 
	 * @param ary 書き込みデータ
	 */
	public static void write(List<String> ary) {
		File file = new File(DATA_PATH);
		File dir = new File(file.getParent());
		if (!dir.isDirectory()) {
			dir.mkdir();
		}
		write(DATA_PATH, ary);
	}

	/**
	 * データファイルよりデータ読み込み
	 * 
	 * @return 読み込みデータ
	 */
	public static LinkedHashMap<String, String> readMap() {
		return aryToMap(read(DATA_PATH), SEP);
	}

	/**
	 * データファイルに書き込み
	 * 
	 * @param map 書き込みデータ
	 */
	public static void writeMap(LinkedHashMap<String, String> map) {
		write(DATA_PATH, mapToAry(map, SEP));
	}
}


			

ファイル読み込み

テキストファイルの読み込みはFileReaderクラスで行います。これだけでも読み込めるのですが、これにBufferedReaderをかぶせる
ことで使い勝手がよくなります。
				
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
	
			

ファイルを読み込んだら、クローズ処理を行う必要があるのですが、try-with-resourcesを利用することにより
クローズ処理の記述を省略できます。


ファイル書き込み

テキストファイルの書き込みはFileWriterクラスを使用します。
				
try (FileWriter filewriter = new FileWriter(path, false)) {
	
			
これもクローズ処理を行う必要があるのですが、try-with-resourcesよりクローズ処理の記述を省略できます。

ファイル追記

テキストファイルの追記は、FileWriterクラスで第二引数にtrueを指定すると追記されるようになります。
				
try (FileWriter filewriter = new FileWriter(path, true)) {
	
			

改行

改行文字はSystem.lineSeparator()で埋め込めます。"\r\n"でもいけます。
				
System.lineSeparator()


			

その他

そのまま使えるようにいくつかメソッドを付け足しています。
環境に合わせて変更して使って下さい。

テキストファイルの読み書き(UTF8)

上記サンプルを文字コード:UTF8版にすると以下になります。
				
package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

public class FileTest {
	public static void main(String[] args) {
		String dir = "C:\\work\\hp\\";

		// ファイル読み込みテスト
		List<String> ret = read(dir + "desktop.txt");
		System.out.println(ret);

		List<String> ret3 = read();
		write(ret3);

		// ファイル書き込みテスト
		write(dir + "new.txt", ret);

		// マップ変換
		LinkedHashMap<String, String> map = aryToMap(ret, "\t");
		map.put("aaa2", "bbb");
		List<String> ret2 = mapToAry(map, ",");
		write(dir + "new2.txt", ret2);

		// ファイル追記
		append(dir + "new2.txt", "new1");
		debuglog("xxx");
	}

	/**
	 * テキストファイル読み込み
	 * 
	 * @param path ファイルパス
	 * @return ファイルデータ
	 */
	public static List<String> read(String path) {
		ArrayList<String> ret = new ArrayList<>();

		try (BufferedReader br = new BufferedReader(
				new InputStreamReader(new FileInputStream(new File(path)), "UTF-8"))) {
			String line;
			while ((line = br.readLine()) != null) {
				ret.add(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * ファイル書き込み
	 * 
	 * @param path ファイルパス
	 * @param ary ファイルデータ
	 */
	public static void write(String path, List<String> ary) {
		try (PrintWriter printwriter = new PrintWriter(new BufferedWriter(
			new OutputStreamWriter(new FileOutputStream(new File(path), false), "UTF-8")))) {

			for (String str : ary) {
				printwriter.println(str);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * ファイル追記
	 * 
	 * @param path ファイルパス
	 * @param str 追記テキスト
	 */
	public static void append(String path, String str) {
		try (PrintWriter printwriter = new PrintWriter(new BufferedWriter(
			new OutputStreamWriter(new FileOutputStream(new File(path), true), "UTF-8")))) {

			printwriter.println(str);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * リスト→マップ変換
	 * 
	 * @param ary 変換元リスト
	 * @param regex 区切り文字
	 * @return 変換先マップ
	 */
	public static LinkedHashMap<String, String> aryToMap(List<String> ary, String regex) {
		LinkedHashMap<String, String> ret = new LinkedHashMap<>();
		for (String str : ary) {
			String[] strs = str.split(regex);
			if (strs.length == 2) {
				ret.put(strs[0], strs[1]);
			}
		}

		return ret;
	}

	/**
	 * マップ→リスト変換
	 * 
	 * @param map 変換元マップ
	 * @param sep 区切り文字
	 * @return 変換先リスト
	 */
	public static List<String> mapToAry(LinkedHashMap<String, String> map, String sep) {
		ArrayList<String> ret = new ArrayList<>();
		for (String key : map.keySet()) {
			ret.add(key + sep + map.get(key));
		}
		return ret;
	}

	/** ログフォルダパス */
	public static final String LOG_PATH = "C:\\debug\\";

	/**
	 * デバッグログ出力
	 * 
	 * @param str 出力内容
	 */
	public static void debuglog(String str) {
		Date date = new Date();
		SimpleDateFormat sdfFile = new SimpleDateFormat("yyyyMMdd");
		SimpleDateFormat sdfText = new SimpleDateFormat("HHmmss");
		File dir = new File(LOG_PATH);
		if (!dir.isDirectory()) {
			dir.mkdir();
		}
		append(LOG_PATH + "log" + sdfFile.format(date) + ".txt", sdfText.format(date) + "\t" + str);
	}

	/** データファイルパス */
	public static final String DATA_PATH = "C:\\debug\\data.txt";

	/** 区切り文字 */
	public static final String SEP = "\t";

	/**
	 * データファイルよりデータ読み込み
	 * 
	 * @return 読み込みデータ
	 */
	public static List<String> read() {
		return read(DATA_PATH);
	}

	/**
	 * データファイルに書き込み
	 * 
	 * @param ary 書き込みデータ
	 */
	public static void write(List<String> ary) {
		File file = new File(DATA_PATH);
		File dir = new File(file.getParent());
		if (!dir.isDirectory()) {
			dir.mkdir();
		}
		write(DATA_PATH, ary);
	}

	/**
	 * データファイルよりデータ読み込み
	 * 
	 * @return 読み込みデータ
	 */
	public static LinkedHashMap<String, String> readMap() {
		return aryToMap(read(DATA_PATH), SEP);
	}

	/**
	 * データファイルに書き込み
	 * 
	 * @param map 書き込みデータ
	 */
	public static void writeMap(LinkedHashMap<String, String> map) {
		write(DATA_PATH, mapToAry(map, SEP));
	}
}

			
シフトJISコードの場合、SJISを指定し、日本語EUCコードの場合、EUC-JPを指定する。
				
	try (BufferedReader br = new BufferedReader(
			new InputStreamReader(new FileInputStream(new File(path)), "UTF-8"))) {

	try (BufferedReader br = new BufferedReader(
			new InputStreamReader(new FileInputStream(new File(path)), "SJIS"))) {

	try (BufferedReader br = new BufferedReader(
			new InputStreamReader(new FileInputStream(new File(path)), "EUC-JP"))) {


			

ページのトップへ戻る