テキストファイル
今回はテキストファイルの読み書きをやります。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"))) {
ページのトップへ戻る