We have a rather large and complex application written in Java which is running on top of the Gridgain package. The problem I am having is that this application will sit there p
There is little point in overriding finalize()
. If the handle is getting garbage collected and finalized, then so is the instance of java.io.BufferedReader
and it will get closed.
It is possible (according to the spec) that the handle is being garbage collected but not finalized, but this is not very likely.
You could try using PhantomReference
s to clean up unused file handles, but my guess is that your instances of BufferedReaderImpl
are still referenced from somewhere (e.g. values in a Map
from filenames to open handles) and that is what is preventing them from being closed (in which case finalizers will not help.)
Java specification says that it is not guarantee that 'finalize()
' will be executed. Your code must explicitly close FileReader
yourself.
Finalizers can't be relied on to be called. It's not a good approach for resource management. The standard construct in Java for this is:
InputStream in = null;
try {
in = ...;
// do stuff
} catch (IOException e) {
// error
} finally {
if (in != null) { try { in.close(); } catch (Exception e) { } }
in = null;
}
You may want to wrap these handles inside a class but that's not a robust approach.