たなちの開発日誌

自分の知識をストックしていくためのブログ

【Java】try-with-resources文でリソースの解放し忘れを防ぐ

csv出力なんかをするときに、finallyでリソースの解放をしてあげないといけないのかな…?と思っていたが、JavaSE7以降はtry-with-resources文を使えばスマートに解放できる。

try-with-resources 文は、文の終わりで各リソースが確実に閉じられるようにします。 java.io.Closeable を実装しているすべてのオブジェクトも含め、java.lang.AutoCloseable インタフェースを実装しているオブジェクト*1はリソースとして使用できます。

try-with-resources 文

注意点としては、リソース解放の対象クラスはネストせずにセミコロンで区切って宣言すること。そうしないと、コンストラクタで例外が発生した場合にリソースが解放されない場合*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);
                }
        }
}

その他参考サイト

try-with-resources文の基本 - Qiita