Javaのリソースを自動でクローズするtry-with-resources文のサンプルです。(確認環境:Java8)
目次
サンプル | リソースを自動でクローズするtry-with-resources文 |
try-with-resources文のサンプル | |
try-with-resources文の対象のクラス |
リソースを自動でクローズするtry-with-resources文
try (resource [ ;resource]...) { } |
- tryの後ろのかっこにresource (リソース)を記述します。
- リソースとは、AutoCloseableインターフェースまたはCloseableインタフェースを実装したクラスをインスタンス化した変数です。
- tryのブロックを抜けるときにリソースがcloseされます。
※「{」(波括弧) から「}」までをブロックといいます。
→finally句でのリソースをcloseする記述が不要になります。 - リソースのスコープはtryブロック配下のみです。
- リソースが複数ある場合はセミコロンで区切ります。
- リソースのclose処理中に発生した例外は無視されます。
- リソースのcloseの順番は定義の逆の順番です。(後ろから前へ進む)
- Java 7で導入されました。
- 以下は、Oracleのtry-with-resources文のリンクです。
https://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html
try-with-resources文のサンプル
package test1;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) {
String dir = "D:\\workspace123abc";
String filename1 = "\\test1.png";
String filename2 = "\\test2.png";
// try-with-resources文
try (FileInputStream reader = new FileInputStream(dir + filename1);
FileOutputStream writer = new FileOutputStream(dir + filename2)){
int data;
while ((data = reader.read()) != -1) {
writer.write(data);
}
} catch (IOException e) {
e.printStackTrace();
//finally句でのリソースのcloseは不要
}finally{
// try{
// if (reader!=null){
// reader.close();
// }
// if (writer!=null){
// writer.close();
// }
// } catch (IOException e) {
// e.printStackTrace();
// }
}
}
}
13,14行目はtry-with-resources文です。リソースは自動でクローズされます。
リソースのreaderとwriterの間は、セミコロンで区切っています。
クローズするときの順番は、定義の逆になります。最初にwriter、次にreaderの順番でクローズします。
26-31行目のfinally句でのcloseは不要です。
try-with-resources文の対象のクラス
AutoCloseableインターフェースまたはCloseableインタフェースを実装したクラスが対象です。
対象のクラスは、以下のリンクで確認できます。
Java8 API仕様のAutoCloseableインターフェースのリンク
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/AutoCloseable.html
Java8 API仕様のCloseableインターフェースのリンク
https://docs.oracle.com/javase/jp/8/docs/api/java/io/Closeable.html
関連の記事
Java バイナリファイルの読み書き(FileInputStream)
Java バッファでファイルの読み書き(BufferedReader)