Ao usar FileLock do Java, é ok para deixar close () para automaticamente fazer um lock.release ()?
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 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();
}
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?
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.