2012-01-10 18 views
8

Java 7 WatchService API'sini temel alan bir dizindeki dosyaların içeriğini izleyen bir uygulamada yinelenen bir sorunla karşılaşıyorum. Temel dosya sistemi bir dosya üzerinde bir değişiklik olayı başlattığında, SHA-256'yı hemen hesaplamak istiyorum.Java I/O: Bir dosyanın herhangi bir yeniden işlem yapmadan önce başka bir işlem tarafından kilitlenmediğinden emin olun

Ancak, genellikle başka bir işlemin dosyanın açılmış olması (yani Word), dolayısıyla özel bir kilidi göz ardı etmesi ve uygulamamın herhangi bir okuma/yazma işleminden engellenmesi de meydana gelir. Herhangi Akış/Kanal açıldı dosyaya karşı oluşturulan, bir FileNotFoundException veya nio APı'NIN için FileSystemException gibi bir mesajla birlikte atılır: başka bir işlem tarafından kullanıldığı için işlem dosyaya erişemiyor

Dosya gerçekten fs'de olmadığında "gerçek" FileNotFoundException'ı maskelemeden bu tür durumları algılayacak bir çözümle gelemedim.

Varolan dosyayı File.exists aracılığıyla denetleme düşüncesiyle geldim ve bir akış açtığımda FileNotFoundException atılırsa, dosyanın kilitlendiğini anlayabilirim. Bu konuda herhangi bir girişe açığım!

Teşekkürler!

+0

hiç bu çözüm bulmak ... sonsuzluğa sırasında dosyalarda kolları tutar? –

+0

File UdFatchException catch bloğu içinde File.exists true döndürürse, dosya kilitli olarak yorumladım, belirtilen sezgisel kullanarak sona erdi. – sylvain

cevap

1

Dosyayı kendiniz kilitlemeyi denediniz mi? Kilitli ve mevcut değilse sadece bir kilit elde edebileceğinizi varsayardım.

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29

+0

tryLock() yöntemini arayaramadım çünkü RandomAccessFile veya FileOutputStream aracılığıyla bir FileChannel'i almaya çalıştığımda bahsedilen istisnalar atılıyor. – sylvain

+0

Bu durumda, bu dosyalara erişmeye çalıştığınızda atılan Özel Durum'u kontrol etmeniz gerektiği gibi geliyor. Dosya kilitliyse, onu arayamazsanız tryLock noktasını göremiyorum. –

+1

Tahminimce, yerel uygulamalar, JVM'de bulunanlardan daha kısıtlayıcı kilitlere sahip olabilir. – sylvain

0

paylaşım belgeler adanmış dosya sistemlerini kullanarak değil (GFS olabilir gibi) .. Java kilitleme API çok yardımcı olabileceğini sanmıyorum zaman süreçleri özellikle zor olduğunu genelinde, sana üzerinde olduğunu düşünüyorum try/fail stratejisi fikrinizle doğru yol ... java 7'yi kullanarak dosya değişikliklerini izlemek ve ardından iş gereksinimlerinize göre hareket etmek için bir WatchService kullanabilirsiniz ... Ne tür bir sistem kullanıyorsunuz? , Windows

HTH Jerome

+0

Gerçekten de FS olaylarını dinleyen bir WatchService iş parçacığım var, şimdilik sadece Windows'ta çalışıyor. Neyse, bu kilitli dosyalara erişmenin bir yolu olmayacağını biliyordum, ancak erişilebilirliğini test etmek için java.io veya java.nio içinde bir API olmadığına şaşıyorum. – sylvain

İlgili konular