Quando si utilizza FileLock di Java, è consentito lasciare close () per eseguire automaticamente un lock.release ()?
Domanda
Come molti dovrebbero sapere close ()
chiude anche qualsiasi utilizzo di stream.
Ciò consente il seguente codice:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();
Questo è carino, dal momento che non abbiamo bisogno di un riferimento a FileInputStream
e ricordati di chiuderlo.
Ma funziona anche con 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();
}
Ho provato questo codice e il blocco viene rilasciato correttamente quando viene chiamato br.close ()
, ma è sicuro farlo? Il JavaDoc richiudibile dice , " Chiude questo flusso e rilascia tutte le risorse di sistema ad esso associate. " Sono sicuro di supporre che sto usando close ()
come specificato in release ()
il lucchetto?
Soluzione
Secondo JavaDoc :
Rimane valido fino a quando il blocco non lo è rilasciato invocando il rilascio metodo, chiudendo il canale che è stato utilizzato per acquisirlo, o dal terminazione di Java virtuale macchina, a seconda di quale evento si verifica per primo.
Ed ecco i contenuti di FileInputStream.close()
public void close() throws IOException {
if (channel != null)
channel.close();
close0();
}
Sembra che close
sullo stream chiuda il canale che rilascia il blocco.
Altri suggerimenti
Sì.
I blocchi dipendono da un descrittore di file. Quando non esiste un descrittore di file che rappresenti un file in un processo, non ci sarebbe un blocco associato ad esso.