Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When using Java's FileLock, is it ok to let close() to automatically do a lock.release()?

Tags:

java

nio

filelock

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 FileLocks?

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?

like image 939
Pyrolistical Avatar asked Jan 07 '09 19:01

Pyrolistical


1 Answers

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.

like image 79
sblundy Avatar answered Oct 31 '22 15:10

sblundy