当同时对一个文件进行操作的时候,很可能出现错误甚至锁坏文件。
在某些情况下,有一个应用的两个实例同事操作一个文件,第一个实例应该锁定这个文件,第二个实例发现这个文件被锁定,是等待它解锁还是跳过文件操作呢。
锁定一个文件,可以使用FileChannel的lock()或teylock()方法:
FileOutputStream f = new FileOutputStream("asdadasd");
FileChannel channel = f.getChannel();
FileLock lock = channel.lock();
lock()这个方法是一个阻塞的方法,当无法获得锁的时候,这个方法将阻塞,直到获得锁。
FileOutputStream f = new FileOutputStream("asdadasd");
FileChannel channel = f.getChannel();
FileLock lock = channel.tryLock();
tryLock()这个方法是非阻塞的方法,要么获得锁,要么返回空。
释放锁有两种方式,关闭通道,或者调用lock的release()方法。
甚至可以锁定文件的某一部分,如:
FileOutputStream f = new FileOutputStream("asdadasd");
FileChannel channel = f.getChannel();
FileLock lock = channel.lock(0, 100, true); // 也可用FileLock lock = channel.tryLock(0, 100, true);
第三个参数表明这是否是一个共享锁。若是true,表示一个共享锁,允许读个进程读文件,且不允许其他进程获得独占锁;若是false,表示这是一个独占锁,不允许其他进程操作文件。注意,并非所有的操作系统支持共享锁,为true的时候也可能返回独占锁,可以调用FileLock的isShared()方法查看锁的类型。