4

現在の Eclipe Juno Release Candidate でいくつかの古いコードを開いたところ、光沢のある新しい警告であるリソース リークに気付きました。次のようなコードによってトリガーされました。

FileChannel out = new FileOutputStream(file).getChannel();
try
{
    ...Do something with out...
}
finally
{
    out.close();
}

Eclipse は、作成されたファイル出力ストリームがリソース リークであると考えています。実際、これが誤った警告なのか (また、FileChannel の close メソッドもストリームを閉じないのか)、それとも本当にリソース リークなのかはわかりません。コードを次のように変更しました。

FileOutputStream outStream = new FileOutputStream(file);
try
{
    FileChannel out = outStream.getChannel();
    ...Do something with out...
}
finally
{
    outStream.close();
}

警告はなくなりましたが、FileChannel の close メソッドを呼び出す必要があるかどうかはわかりません。したがって、おそらく次のようになります。

FileOutputStream outStream = new FileOutputStream(file);
try
{
    FileChannel out = outStream.getChannel();
    try
    {
        ...Do something with out...
    }
    finally
    {
        out.close();
    }
}
finally
{
    outStream.close();
}

ファイル入力チャネルとファイル出力チャネルを使用すると、4 つの入れ子になった try...finally ブロックが発生し、すべて肥大化します。

どう思いますか?チャネルとストリームを閉じる必要は本当にありますか? それとも、ストリームを閉じるだけで十分ですか?

4

1 に答える 1

9

ああ、FileOutputStream の close() メソッドのドキュメントに答えが見つかりました。

If this stream has an associated channel then the channel is closed as well.

したがって、ストリームを閉じるだけで十分です。

于 2012-06-15T11:27:58.290 に答える