どういうわけか、プロジェクトが変わる毎に、利用するプログラミング言語も変わることが多い。
毎回、テキストファイルの入出力がどうだったか、ググってしまう。
今の現場は、Javaなので、まとめみる!
書き込み
List<String> lines = new ArrayList<>();
lines.add(LocalDateTime.now().toString());
final String baseDir = "c:/tmp";
File f = new File(baseDir + "/timestamp.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
lines.forEach(line -> {
try {
bw.write(line);
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
}
});
bw.close();
- 改良版。クロースを書かなくても大丈夫になっている
- 最後にcatchの部分が増えているので、修正前の方が見やすい。
- と言うわけで、改良できていない?!
List<String> lines = new ArrayList<>();
lines.add(LocalDateTime.now().toString());
final String baseDir = "c:/tmp";
File f = new File(baseDir + "/timestamp.txt");
try (BufferedWriter bw = new BufferedWriter(new FileWriter(f));) {
lines.forEach(line -> {
try {
bw.write(line);
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException e) {
for (Throwable t : e.getSuppressed()) {
t.printStackTrace();
}
}
読み込み
- ラムダ式内で外部に定義された変数の値は変更できない。
- だが、配列なら書き換えられるというよく分からない仕組みになっている。
- 【参考】ラムダ式で、なぜ外側に定義された配列の値を変更できるのか
final String baseDir = "c:/tmp";
File f = new File(baseDir + "/timestamp.txt");
StringBuffer sb = new StringBuffer();
String[] lineSeparator = { "" };
BufferedReader br = new BufferedReader(new FileReader(f));
br.lines().forEach(line -> {
sb.append(lineSeparator[0]);
sb.append(line);
lineSeparator[0] = System.lineSeparator();
});
br.close();
- こちらも改良版を作りました。
final String baseDir = "c:/tmp";
File f = new File(baseDir + "/timestamp.txt");
StringBuffer sb = new StringBuffer();
String[] lineSeparator = { "" };
try (BufferedReader br = new BufferedReader(new FileReader(f));) {
br.lines().forEach(line -> {
sb.append(lineSeparator[0]);
sb.append(line);
lineSeparator[0] = System.lineSeparator();
});
} catch (Exception e) {
e.printStackTrace();
}