Wenn Java FileLock verwenden, ist es ok schließen zu lassen (), um automatisch eine lock.release zu tun ()?

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

  •  05-07-2019
  •  | 
  •  

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 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();
}

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()?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top