2009-01-07 6 views
11

Çoğu, close()'un bildiği gibi, akışları da kullanır.Java'nın FileLock'ını kullanırken, close() işlevinin otomatik olarak bir lock.release() yapmasını sağlamak tamam mı?

Bu takip kodunu verir: Biz FileInputStream bir başvuru ihtiyaç ve kapatmak hatırlamıyorum beri

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

Bu, güzel.

Ama aynı zamanda FileLock s için çalışıyor mu?

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

Bu kodu denedim ve kilit düzgün br.close() çağrıldığında serbest bırakılır, ama bunu yapmak için güvenlidir? Closeable JavaDoc, "Bu akışı kapatır ve ilişkili tüm sistem kaynaklarını serbest bırakır." numaralı kilidin, release() numaralı kilidi belirtildiği gibi kullanacağımı farz etmem gerekir mi?

cevap

7

JavaDoc:

kilit açma yöntemini çağırarak yayımlanan hale gelmesi geçerli kalır, bunu elde etmek için kullanılan, ya fesih yoluyla olduğu kanalını kapatarak Java sanal makinesi, hangisi önce gelirse.

Ve burada FileInputStream.close()

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

Bu akışta close benziyor içeriği olan kilidi serbest bırakır kanalı kapatır.

1

Evet.

Kilitler bir dosya tanıtıcısına göre değişir. Bir işlemde bir dosyayı temsil eden bir dosya tanıtıcısı olmadığında, onunla ilişkili bir kilit olmaz. göre

İlgili konular