При использовании Java FileLock разрешено ли закрывать() автоматически делать lock.release()?
Как известно большинству, close()
также закрывает использование любых потоков.
Это позволяет использовать следующий код:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();
Это хорошо, поскольку нам не нужна ссылка на FileInputStream
и не забудьте закрыть его.
Но это также работает для 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();
}
Я пробовал этот код, и блокировка была правильно выпущена при вызове br.close()
, но безопасно ли это сделать? Closeable JavaDoc говорит: "Закрывает этот поток и выпускает любые связанные с ним системные ресурсы". Можно ли предположить, что я использую close()
как указано для release()
блокировки?
Ответы
Ответ 1
В соответствии с JavaDoc:
Он остается действительным до тех пор, пока блокировка не будет выпущено путем вызова выпуска метода, закрывая канал, который был использован для его приобретения или завершение виртуальной виртуальной машины Java машина, в зависимости от того, что наступит раньше.
И вот содержимое FileInputStream.close()
public void close() throws IOException {
if (channel != null)
channel.close();
close0();
}
Похоже, что close
в потоке закрывает канал, который освобождает блокировку.
Ответ 2
Да.
Замки зависят от дескриптора файла. Когда нет дескриптора файла, представляющего файл в процессе, не было бы привязки к нему.