Java リソースを自動でクローズ(try-with-resources文)

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)

△上に戻る