Wenn Java FileLock verwenden, ist es ok schließen zu lassen (), um automatisch eine lock.release zu tun ()?
Frage
Wie die meisten wissen sollten close()
schließt auch alle Streams verwendet.
Auf diese Weise kann die Folge Code:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();
Das ist schön, da wir es schließen keinen Verweis müssen FileInputStream
und erinnern.
Aber funktioniert es auch für 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();
}
Ich habe diesen Code versucht, und die Sperre wird korrekt freigegeben, wenn br.close()
genannt wird, ist aber sicher ist, dies zu tun? Die Verschließbare JavaDoc sagt „Schließt diesen Stream und gibt alle Systemressourcen mit ihm verbunden ist.“ bin ich sicher davon ausgehen, dass ich close()
bin mit wie angegeben um die Sperre release()
?
Lösung
Nach dem JavaDoc :
Es bleibt gültig, bis die Sperre Freigabe durch den Freigabe Aufrufe Verfahren, die durch den Kanal zu schließen, dass wurde verwendet es, oder durch die erwerben Beendigung der virtuellen Java Maschine, je nachdem, was zuerst eintritt.
Und hier sind die Inhalte von FileInputStream.close()
public void close() throws IOException {
if (channel != null)
channel.close();
close0();
}
Es sieht aus wie close
auf dem Strom den Kanal schließt, die die Sperre freigibt.
Andere Tipps
Ja.
Schlösser hängen von einem Dateideskriptor. Wenn es keinen Dateideskriptor ist eine Datei in einem Prozess darstellt, gäbe es nicht eine Sperre in Verbindung gebracht wird mit ihm.