2009-01-07 111 views
11

正如大多數人應該知道的close()也關閉任何流使用。使用Java的FileLock時,可以讓close()自動執行lock.release()嗎?

這使得後續代碼:

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

這是很好的,因爲我們並不需要FileInputStream參考,並記得要關閉它。

但它也適用於FileLock

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

我試過這個代碼,並鎖定正確釋放時br.close()被調用,而是做是安全的呢? Closeable JavaDoc表示,「關閉此流並釋放與其關聯的所有系統資源。」我可以安全地假設我正在使用close()指定爲release()的鎖嗎?

回答

7

按照JavaDoc

直到鎖是 通過調用釋放 方法釋放它仍然有效,通過關閉信道 用於採集,或由 終止Java虛擬 機器,以先到者爲準。

這裏是FileInputStream.close()

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

它看起來像close流上的內容關閉其解除鎖定的頻道。

1

是的。

鎖取決於文件描述符。當進程中沒有表示文件的文件描述符時,不會有與其關聯的鎖。

相關問題