2009-01-07 1 views
11

Wie die meisten wissen sollten close() schließt auch alle Streams verwendet.Wenn Sie Javas FileLock verwenden, ist es ok, close() zu lassen, um automatisch eine lock.release() zu machen?

Dies ermöglicht den Folgecode:

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

Das ist schön, da wir es schließen nicht einen Verweis auf FileInputStream brauchen und sie 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, das Schloss wird korrekt freigegeben, wenn br.close() genannt wird, ist aber sicher ist, dies zu tun? Die Closeable JavaDoc sagt, "Schließt diesen Stream und gibt alle damit verbundenen Systemressourcen frei." Kann ich davon ausgehen, dass ich close() wie angegeben zu release() das Schloss verwende?

Antwort

7

Nach der JavaDoc:

Es bleibt gültig, bis die Sperre durch Aufrufen der Release Verfahren gelöst wird, die durch den Kanal zu schließen, dass verwendet wurde, sie zu erwerben, oder durch die Beendigung der Java virtuelle Maschine, je nachdem, was zuerst kommt.

Und hier sind die Inhalte von FileInputStream.close()

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

Es ist wie close im Stream sieht schließt den Kanal, der die Sperre freigibt.

1

Ja.

Sperren hängen von einem Dateideskriptor ab. Wenn es keinen Dateideskriptor gibt, der eine Datei in einem Prozess darstellt, wäre keine Sperre zugeordnet.

Verwandte Themen