先日ファイル入出力の処理をいろいろと書いていたところ、例外処理について社長からアドバイスをいただきました。
ファイルの入出力について
ファイルの入出力を行う場合、ストリームで接続口を開いた場合、IOExceptionが発生した場合もそうでない場合も下記のように接続口を閉じる必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
InputStream is =null; try{ is = new FileInputStream("hoge.txt"); InputStreamReader ir = new InputStreamReader(is,"Shift_JIS"); //何らかの読み込み処理 is.close() }catch(Exception e){ e.printStackTrace(); }finally { if( is != null ){ is.close(); } } |
try-with-resource
上記のような表記が冗長のため、下記のようにtry文の開始に入力処理を書いておけば、自動で閉じてくれます。
1 2 3 4 5 |
try(InputStream is2 = new FileInputStream("hoge.txt")){ //何らかの処理 }catch (Exception e){ e.printStackTrace(); } |
ちなみにストリームが2か所あっても下記のように改行して、つなげれば問題ありません。
1 2 3 4 5 6 |
try(InputStream is2 = new FileInputStream("hoge.txt"); OutputStream os2 = new FileOutputStream("hige.txt")){ //何らかの処理 }catch (Exception e){ e.printStackTrace(); } |
この記述自体はよく見かけていたのですが、これがtry-with-resourceという表現だとはしりませんでした。うーん不勉強・・・
参考リンク
http://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html
Java7 体当たり/try-with-resources Statement