ストリームを安全に閉じる
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- BufferedReaderを使う理由
- 行の読み取り
- 入力から数値を解析する
- ストリームを安全に閉じる