При использовании FileLock в Java, можно ли разрешить close () автоматически выполнять lock.release ()? - PullRequest
12 голосов
/ 07 января 2009

Как большинство должно знать, 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() блокировка

Ответы [ 2 ]

8 голосов
/ 07 января 2009

Согласно JavaDoc :

Действует до тех пор, пока блокировка не будет выпущен путем вызова релиза метод, закрыв канал, который был использован для его приобретения или прекращение виртуальной Java машина, в зависимости от того, что наступит раньше.

А вот содержимое FileInputStream.close()

public void close() throws IOException {
    if (channel != null)
        channel.close();
    close0();
}

Похоже, close в потоке закрывает канал, который снимает блокировку.

1 голос
/ 07 января 2009

Да.

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

...