При использовании Java FileLock можно ли разрешить close() автоматически выполнять lock.release()?

StackOverflow https://stackoverflow.com/questions/421833

  •  05-07-2019
  •  | 
  •  

Вопрос

Как большинство должно знать 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 в потоке закрывает канал, который снимает блокировку.

Другие советы

Да.

Блокировки зависят от дескриптора файла.Если в процессе нет файлового дескриптора, представляющего файл, с ним не будет связана блокировка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top