Ao usar FileLock do Java, é ok para deixar close () para automaticamente fazer um lock.release ()?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Como a maioria deve saber close() também encerra qualquer córregos usos.

Isso permite que o código a seguir:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();

Isso é bom, uma vez que não precisa de uma referência para FileInputStream e lembre-se de fechá-lo.

Mas faz isso também trabalho para 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();
}

Eu tentei este código eo bloqueio está corretamente liberada quando br.close() é chamado, mas está é seguro fazê-lo? A closeable JavaDoc diz , "Fecha este fluxo e libera os recursos do sistema associados." Am I seguro assumir que estou usando close() conforme especificado para release() o bloqueio?

Foi útil?

Solução

De acordo com a JavaDoc :

Ele permanece válida até que o bloqueio é lançado invocando o lançamento método, fechando o canal que foi usado para adquiri-lo, ou pelo rescisão do Java Virtual máquina, o que ocorrer primeiro.

E aqui é o conteúdo de FileInputStream.close()

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

Parece que close no fluxo fecha o canal que libera o bloqueio.

Outras dicas

Sim.

Locks depender de um descritor de arquivo. Quando não há nenhum descritor de arquivo que representa um arquivo em um processo, não haveria um bloqueio associado a ele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top