0Pricing
Java Academy · レッスン

ストリームを安全に閉じる

try-with-resourcesを学びます。

「ストリームを安全に閉じる」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

ストリームを閉じる理由

BufferedReader のようなストリームは、ファイルハンドル、メモリバッファ、接続などのシステムリソースを保持します。閉じないままにすると、これらのリソースがリークする可能性があります。

ストリームを閉じると、保持しているリソースが解放され、保留中のデータがフラッシュされます。このレッスンでは、安全に閉じる方法を説明します。

close メソッド

すべてのリーダーには close() メソッドがあります。これを呼び出すと、リソースが解放されます。

System.in をラップしている BufferedReader では、閉じるとラップ対象の基になるストリームも閉じられます。

BufferedReader br =
    new BufferedReader(new InputStreamReader(System.in));
// ... use br ...
br.close();

古く危険な方法

close() を手動で呼び出すこともできますが、その行が実行される前にエラーが発生すると、close() がスキップされ、リソースがリークします。

close() を finally ブロックに入れると役立ちますが、冗長で、間違えやすい方法です。

BufferedReader br = null;
try {
    br = new BufferedReader(
        new InputStreamReader(System.in));
    // ... use br ...
} finally {
    if (br != null) br.close();
}

try-with-resources

Java には、よりすっきりした解決策であるtry-with-resourcesがあります。try の後のかっこ内でストリームを宣言すると、ブロックの終了時に、エラーが発生した場合でも、Java が自動的に閉じてくれます。

finally も、手動の close() も必要ありません。これが現在のベストプラクティスです。

try (BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in))) {
    String line = br.readLine();
    System.out.println(line);
}

仕組み

try (...) のかっこ内で宣言するリソースは、AutoCloseable を実装している必要があります。BufferedReader は実装しているため、Java が close() を呼び出してくれます。

ブロックが正常に終了した場合でも、例外によって終了した場合でも、ブロックの処理が終わった後に閉じられます。

完全な例

try-with-resources を使って1行を読み取る完全なプログラムを見てみましょう。ブロックの最後でリーダーが自動的に閉じられます。

System.in から読み取るため、入力を待機し、この環境では自動実行できません。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in))) {
            String name = br.readLine();
            System.out.println("Hi " + name);
        }
    }
}

StringReader を使った実行可能な例

キーボード入力なしで try-with-resources が動作することを確認するため、ここでは StringReader から読み取ります。完全に実行可能な例です。

ブロックの後でリーダーは自動的に閉じられるため、close() の呼び出しを書く必要はありません。

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        try (BufferedReader br =
                new BufferedReader(new StringReader("done"))) {
            System.out.println(br.readLine());
        }
    }
}

複数のリソース

1つの try に複数のリソースを宣言し、セミコロンで区切ることができます。Java は宣言した順序の逆順ですべてを閉じます。

複数のストリームをまとめてラップするときに便利です。

try (InputStreamReader isr =
        new InputStreamReader(System.in);
     BufferedReader br = new BufferedReader(isr)) {
    System.out.println(br.readLine());
}

IOException の捕捉

読み取りでは IOException がスローされることがあります。try-with-resources ブロックに catch を追加すると、throws を宣言する代わりに処理できます。

catch が実行される前に、リソースは自動的に閉じられます。

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(System.in))) {
    System.out.println(br.readLine());
} catch (IOException e) {
    System.out.println("Read failed");
}

System.in は閉じるべきですか

注意点が1つあります。System.in のリーダーを閉じると System.in 自体も閉じられ、再び開くことはできません。

短いプログラムであれば問題ありません。ただし、後でコンソール入力がまだ必要な場合は、その特定のリーダーを閉じないでください。ストリームが何をラップしているかを把握しておきましょう。

ベストプラクティス

ストリームを安全に扱うには、次の点に注意します。

  • 手動の close() よりも try-with-resources を優先します。
  • エラーが発生した場合でも自動的に閉じられます。
  • System.in のリーダーを閉じると、標準入力も閉じられることを覚えておきます。

リソースを適切に扱うことで、リークやバグを防げます。

クイックチェック

try-with-resources の主な利点について考えてみましょう。

まとめ

ストリームを閉じる必要がある理由、危険な手動/finally による方法、そして AutoCloseable リソースを自動的に閉じる、すっきりしたtry-with-resources パターンを学びました。

これで、最初から最後まで BufferedReader を使って安全に入力を読み取れるようになりました。

よくある質問

「ストリームを安全に閉じる」レッスンは無料ですか?

はい。「ストリームを安全に閉じる」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「ストリームを安全に閉じる」で何を学びますか?

try-with-resourcesを学びます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「ストリームを安全に閉じる」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. BufferedReaderを使う理由
  2. 行の読み取り
  3. 入力から数値を解析する
  4. ストリームを安全に閉じる
← Java Academyに戻る