代码之家  ›  专栏  ›  技术社区  ›  Dónal

Java文件锁定

  •  1
  • Dónal  · 技术社区  · 14 年前

    public abstract class LockedFileOperation {
    
        public void execute(File file) throws IOException {
    
            if (!file.exists()) {
                throw new FileNotFoundException(file.getAbsolutePath());
            }
    
            FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
            // Get an exclusive lock on the whole file
            FileLock lock = channel.lock();
            try {
                lock = channel.lock();
                doWithLockedFile(file);
            } finally {
                lock.release();
            }
        }
    
        public abstract void doWithLockedFile(File file) throws IOException;
    }
    

    我写了一个单元测试,它创建了 LockedFileOperation 试图重命名锁定文件的

    public void testFileLocking() throws Exception {
    
        File file = new File("C:/Temp/foo/bar.txt");
        final File newFile = new File("C:/Temp/foo/bar2.txt");
    
        new LockedFileOperation() {
    
            @Override
            public void doWithLockedFile(File file) throws IOException {
                if (!file.renameTo(newFile)) {
                    throw new IOException("Failed to rename " + file + " to " + newFile);
                }
            }
        }.execute(file);
    }
    

    OverlappingFileLockException channel.lock() 被称为。我不清楚为什么会发生这种情况,因为我只试图锁定此文件一次。

    在任何情况下 lock()

    调用此方法将 此频道已关闭,或 调用线程被中断,

    所以即使文件已经被锁定 锁定() 方法应该阻塞,而不是抛出 重叠文件锁定异常

    我想有一些基本的 FileLock 我是误会。我在WindowsXP上运行(以防万一)。

    谢谢, 唐

    1 回复  |  直到 14 年前
        1
  •  7
  •   Tomas Narros    14 年前

    您锁定了两次文件,但从未释放第一个锁:

        // Get an exclusive lock on the whole file
        FileLock lock = channel.lock();
        try {
            lock = channel.lock();
            doWithLockedFile(file);
        } finally {
            lock.release();
        }
    

    您的代码应该是:

        // Get an exclusive lock on the whole file
        FileLock lock = null;
        try {
            lock = channel.lock();
            doWithLockedFile(file);
        } finally {
            if(lock!=null) {
               lock.release();
             }
        }