Java : AutoCloseable - API使用例

AutoCloseable (Java SE 17 & JDK 17) は try-with-resources文 で使用される重要なインタフェースです。
ぜひ有効に活用していきしましょう。


概要

閉じられるまで、リソース(ファイルやソケット・ハンドルなど)を保持できるオブジェクト。 AutoCloseableオブジェクトのclose()メソッドは、リソース指定ヘッダーでそのオブジェクトが宣言されている try-with-resourcesブロックの終了時に自動的に呼び出されます。

クラス構成

独自に定義したサンプルクラスを使った例になります。

class Sample implements AutoCloseable {

    @Override
    public void close() {
        System.out.println("close : called!");
    }

    public void print() {
        System.out.println("print!");
    }
}

// スコープを抜けるときに、自動的にAutoCloseable.closeが呼び出されます。
try (final var sample = new Sample()) {
    sample.print();
}

System.out.println("end!");

// 結果
// ↓
//print!
//close : called!
//end!
// 例外が発生しても同様に呼び出されます。
try (final var sample = new Sample()) {
    throw new IllegalStateException();
} catch (IllegalStateException e) {
    System.out.println("IllegalStateException!");
}

// 結果
// ↓
//close : called!
//IllegalStateException!

標準APIでも、リソース解放を必要とするさまざまなクラスで AutoCloseable が実装されています。
特に理由がない限りは、try-with-resources文 を使うことをおすすめします。

try-with-resources文については本サイトでも記事にしていますので、そちらも参考にしていただけたら幸いです。

メソッド

void close ()

このリソースを閉じ、ベースとなるリソースをすべて解放します。

final var file = Path.of("R:", "java-work", "test.txt");
System.out.println(file); // R:\java-work\test.txt

// スコープを抜けたら、自動的にcloseが呼び出されてリソースが解放されます。
try (final var writer = Files.newBufferedWriter(file)) {
    writer.write("abcd");
}

final var str = Files.readString(file);
System.out.println(str); // abcd
final var url = new URL("http://example.com");

// スコープを抜けたら、自動的にcloseが呼び出されてリソースが解放されます。
try (final var reader = new BufferedReader(new InputStreamReader(url.openStream()))) {
    reader.lines().forEach(System.out::println);
}

// 結果
// ↓
//<!doctype html>
//<html>
//<head>
//    <title>Example Domain</title>
// ...
//</html>
final var file = Path.of("R:", "java-work", "test.txt");

// try-with-resources文を使わない例です。
final var writer = Files.newBufferedWriter(file);
try {
    writer.write("abcd");
} finally {
    writer.close();
}

final var str = Files.readString(file);
System.out.println(str); // abcd

関連記事

ページの先頭へ