1. ホーム
  2. java

Java入力ストリームのクローズ

2023-10-08 19:03:24

質問

Java InputStreamsを使用する際のclose()メソッドの使用方法についていくつか質問があります。 私が見たり、多くの開発者から読んだりしたところでは、InputStream が不要になったら、常に明示的に close() を呼び出すべきだということでした。 しかし、今日、私はJavaプロパティ・ファイルの使用について調べていたのですが、私が見つけたすべての例には次のようなものがありました。

Properties props = new Properties();
try {
    props.load(new FileInputStream("message.properties"));
    //omitted.
} catch (Exception ex) {}

上記の例では、InputStreamを使用した後は到達できないので、明示的にclose()を呼び出す方法はありません。 多くの人が言うように、明示的に閉じるということと矛盾するようですが、私はInputStreamの似たような使い方をたくさん見てきました。 OracleのJavaDocsに目を通しましたが、Properties.load()メソッドがInputStreamを閉じるかどうかは書かれていません。 私は、これが一般的に受け入れられるのか、それとももっと次のようなことをするのが好ましいのか疑問に思っています。

Properties props = new Properties();
InputStream fis = new FileInputStream("message.properties");
try {
    props.load(fis);
    //omitted.
} catch (Exception ex) {
    //omitted.
} finally {
    try {
        fis.close();
    } catch (IOException ioex) {
        //omitted.
    }
}

どちらの方法がより良く、より効率的なのでしょうか? あるいは、それは本当に重要なことなのでしょうか?

どのように解決するのですか?

の例では プロパティ・チュートリアル を閉じる FileInputStream はロード後に明示的に閉じますので load メソッドに責任があるのではなく、あなたに責任があるのです。

// create and load default properties
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("defaultProperties");
defaultProps.load(in);
in.close();

参考までに アパッチハーモニー の実装を確認しました。 プロパティ を実装しており ではなく はロード時にストリームを閉じます。