As most should know close()
also closes any streams uses.
This allows the follow code:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();
This is nice, since we don't need a reference to FileInputStream
and remember to close it.
But does it also work for FileLock
s?
final FileInputStream fis = new FileInputStream(new File("buffer.txt"));
final FileChannel c = fis.getChannel();
final FileLock lock = c.lock(0L, Long.MAX_VALUE, true);
final BufferedReader br = new BufferedReader(new InputStreamReader(fis));
try {
while(br.ready()) {
System.out.println(br.readLine());
}
} finally {
br.close();
}
I've tried this code and the lock is correctly released when br.close()
is called, but is is safe to do so? The Closeable JavaDoc says, "Closes this stream and releases any system resources associated with it." Am I safe to assume that I am using close()
as specified to release()
the lock?
According to the JavaDoc:
It remains valid until the lock is released by invoking the release method, by closing the channel that was used to acquire it, or by the termination of the Java virtual machine, whichever comes first.
And here are the contents of FileInputStream.close()
public void close() throws IOException {
if (channel != null)
channel.close();
close0();
}
It looks like close
on the stream closes the channel which releases the lock.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With