csv出力なんかをするときに、finallyでリソースの解放をしてあげないといけないのかな…?と思っていたが、JavaSE7以降はtry-with-resources文を使えばスマートに解放できる。
try-with-resources 文は、文の終わりで各リソースが確実に閉じられるようにします。 java.io.Closeable を実装しているすべてのオブジェクトも含め、java.lang.AutoCloseable インタフェースを実装しているオブジェクト*1はリソースとして使用できます。
注意点としては、リソース解放の対象クラスはネストせずにセミコロンで区切って宣言すること。そうしないと、コンストラクタで例外が発生した場合にリソースが解放されない場合*2がある。
csvファイルを作成するコード
public File createCsvFile() throws IOException { File file = File.createTempFile("prefix", ".csv"); file.deleteOnExit(); // try-with-resources文でclose処理を自動化 try (FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(bw);) { String header = "header" + System.lineSeparator(); pw.write(header); pw.write("body"); return file; } catch (Exception e) { throw new SystemException(e); } } }