[Java] 文字列をファイルに書き出す(Java7以降の効率的な書き方)
Java6までは、ファイルを開いたら確実にクローズする必要がありました。
特に例外発生時にクローズ処理が行われずにファイルがロックされたままになるという問題が発生します。
また、オープンに失敗しているときなど、クローズそのものに失敗する可能性もあり、close処理にもtry/catchが必要という分かりづらい実装になりがちでした。
File f= new File(outputDir, outputFileName);
try {
FileWriter fileWriter = new FileWriter(f);
PrintWriter printWriter = new PrintWriter(new BufferedWriter(fileWriter));
// ファイルに書き込む
printWriter.print(contents);
} catch (IOException e) {
this.logger.error(“書き込みエラー”);
} finally {
if (printWriter != null) try { printWriter.close(); } catch (IOException e) {}
if (fileWriter != null) try { fileWriter .close(); } catch (IOException e) {}
}
Java7以降では他の言語でも採用されているAutoCloseの仕組みが使用可能です。
この書き方ではtryの中でのみファイルが開かれており、closeは実装不要で勝手にクローズされます。
文字コード指定も可能です。
try (BufferedWriter bw = Files.newBufferedWriter(f.toPath(), Charset.forName(“MS932”))) {
bw.write(contents);
} catch (IOException e) {
this.logger.error(“書き込みエラー”);
}
かなりシンプルになります。
とはいえ、確実にクローズされているかは確認したほうが良いです。
この書き方ができるのは、AutoCloseableを実装しているクラスのみです。
逆に言えばこれを実装すれば独自クラスにもAutoCloseの仕組みを適用できるということになります。
シニアエンジニアの方だと、Java6までで知識が止まっている方も多いと思います。
結構いろんな機能が追加されていたりしますので、少なくともJava8までの機能は把握しておいたほうが無駄なくバグの発生しにくいソースが書けます。
== ランキングに参加しています。ぜひクリックお願いします ==
Excelのセルサイズを1mmにすることは可能か [Python] 添付ファイル付きメールを送信する