次の機能があるとします
public static void myfunc(String filename) {
new FileInputStream(filename);
}
その関数を呼び出すと、FileInputStream が解放されないため、リソース リークが発生しますか?
今後の参考として、関数が呼び出された後にリソースが解放されていないことを確認する方法はありますか?
次の機能があるとします
public static void myfunc(String filename) {
new FileInputStream(filename);
}
その関数を呼び出すと、FileInputStream が解放されないため、リソース リークが発生しますか?
今後の参考として、関数が呼び出された後にリソースが解放されていないことを確認する方法はありますか?
はい、リソースリークがあります。ほとんどの 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ステートメントを使用できます。
はい、リソースリークが発生します。FileInputStreamは常に閉じる必要があります。
GCが実行されると、finalize()
メソッドが呼び出され、その時点でストリームが閉じられますが、これに依存しないでください。
リソースリークがあることを確認する方法は、それを説明しているjavadocを読むことです。基本的に、Closeableインターフェースを実装するすべてのクラスは、明示的に閉じる必要があります。
この関数は何の役にも立たないことを理解していますよね? FileInputStream を呼び出し元に返すことも、それを使って何かをすることもありません。
通常、ストリームが try/finally ブロックで閉じられていることを確認します。
InputStream input = null ;
try {
input = new FileInputStream(name);
[read and process input]
} finally {
if (input != null) {
input.close();
}
}