我的问题是:我正在使用WatchService
来获取有关特定文件夹中新文件的通知,现在如果文件被移动/复制或在所述文件夹中创建,则会触发事件并且名称为返回新文件。现在的问题是,如果我尝试访问该文件但尚未完全存在(例如副本仍在进行中),则会引发异常。我尝试的是做这样的事情:
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
FileChannel fc = raf.getChannel();
FileLock lck = fc.lock();
但即使获取了一个锁,如果我尝试写入该文件,有时仍然会引发异常,因为另一个进程仍然有一个打开的句柄。
现在,如何锁定Java中的文件以进行真正的独占访问?
答案 0 :(得分:3)
对我来说,声明
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
如果我无法获取文件锁,将返回FileNotFoundException。我抓住了filenotfound异常并对待它......
public static boolean isFileLocked(String filename) {
boolean isLocked=false;
RandomAccessFile fos=null;
try {
File file = new File(filename);
if(file.exists()) {
fos=new RandomAccessFile(file,"rw");
}
} catch (FileNotFoundException e) {
isLocked=true;
}catch (Exception e) {
// handle exception
}finally {
try {
if(fos!=null) {
fos.close();
}
}catch(Exception e) {
//handle exception
}
}
return isLocked;
}
你可以在循环中运行它并等到你锁定文件。不行
FileChannel fc = raf.getChannel();
如果文件被锁定,永远不会到达?你将得到一个FileNotFoundException抛出..
答案 1 :(得分:0)
最好不要使用java.io包中的类,而应使用java.nio包。 后者具有FileLock类,可用于锁定FileChannel。
try {
// Get a file channel for the file
File file = new File("filename");
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
// Use the file channel to create a lock on the file.
// This method blocks until it can retrieve the lock.
FileLock lock = channel.lock();
/*
use channel.lock OR channel.tryLock();
*/
// Try acquiring the lock without blocking. This method returns
// null or throws an exception if the file is already locked.
try {
lock = channel.tryLock();
} catch (OverlappingFileLockException e) {
// File is already locked in this thread or virtual machine
}
// Release the lock - if it is not null!
if( lock != null ) {
lock.release();
}
// Close the file
channel.close();
} catch (Exception e) {
}