1

次の機能があるとします

public static void myfunc(String filename) {
    new FileInputStream(filename);
}

その関数を呼び出すと、FileInputStream が解放されないため、リソース リークが発生しますか?

今後の参考として、関数が呼び出された後にリソースが解放されていないことを確認する方法はありますか?

4

3 に答える 3

2

はい、リソースリークがあります。ほとんどの IDE (Eclipse など) は、これを示す警告を発行します。おそらく、次の行に沿って次のようなことを行う必要があります。

public static void myfunc(String filename) throws IOException {
    FileInputStream stream = null;
    try {
        stream = new FileInputStream(filename);
        ...
    } finally {
        stream.close();
    }
}

または、Java 7 を使用している場合は、try-with-resourceステートメントを使用できます。

于 2013-01-29T19:35:48.500 に答える
1

はい、リソースリークが発生します。FileInputStreamは常に閉じる必要があります。

GCが実行されると、finalize()メソッドが呼び出され、その時点でストリームが閉じられますが、これに依存しないでください。

リソースリークがあることを確認する方法は、それを説明しているjavadocを読むことです。基本的に、Closeableインターフェースを実装するすべてのクラスは、明示的に閉じる必要があります。

于 2013-01-29T19:38:42.783 に答える
-1

この関数は何の役にも立たないことを理解していますよね? FileInputStream を呼び出し元に返すことも、それを使って何かをすることもありません。

通常、ストリームが try/finally ブロックで閉じられていることを確認します。

InputStream input = null ; 

try {
    input = new FileInputStream(name);

    [read and process input]

} finally {
    if (input != null) {
        input.close();
    }
}
于 2013-01-29T19:40:53.570 に答える