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