java中的文件锁定

Posted

技术标签:

【中文标题】java中的文件锁定【英文标题】:File Locking in java 【发布时间】:2019-01-15 13:12:26 【问题描述】:

我有一个文件夹中的文件列表, 我想锁定一个特定文件(用户向我发送要锁定的文件的名称),我正在执行以下操作:

try 

    File file = new File("filename");
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
    FileLock lock = channel.lock();
    try 
        lock = channel.tryLock();
     catch (OverlappingFileLockException e) 
        // File is already locked 
    

 catch (Exception e) 

如果另一个用户想查看文件列表,我必须告诉他们文件的状态是锁定的,哪些是解锁的

   File folder = new File("E:\\folder_to_LIST_OF_FILES");
            File[] listOfFiles = folder.listFiles();

            for (int i = 0; i < listOfFiles.length; i++) 
                if (listOfFiles[i].isFile()) 
                    FilesDto returnDto = new FilesDto();
                    returnDto.setFileName(FilenameUtils.removeExtension(listOfFiles[i].getName()));

                    // Check File Status if file is Locked or unlocked

                    if (lock==null) 
                        returnDto.setStatus("unlocked");
                        returnDto.setFilePath(listOfFiles[i].getAbsolutePath());

                     else 
                        returnDto.setStatus("Locked");
                    

                    returnDtoList.add(returnDto);
                
            

这两个 sn-ps 来自不同的 API。 如何查看文件被锁定或解锁的状态?

【问题讨论】:

我记得有一个函数File.canWrite(),也许它可以帮助 @SapuSeven 已经尝试过了。不工作。它总是返回 TRUE 但是您面临的问题是什么? 是的。 File.canWrite() 不相关。它正在检查权限,而不是(任意)锁定。 @Sidharth - 您的代码中存在潜在缺陷。当FileChannel 关闭(或您的应用程序退出)时,锁将被释放。在第一个代码 sn-p 中,FileChannel 可以在 channel 超出范围后随时关闭。 【参考方案1】:

FileLock 类上的documentation 说:

此文件锁定 API 旨在直接映射到底层操作系统的本机锁定设施。因此,文件上持有的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的。

看来您可以使用与第一个 sn-p 中相同的代码:

File folder = new File("E:\\folder_to_LIST_OF_FILES");
File[] listOfFiles = folder.listFiles();

for (int i = 0; i < listOfFiles.length; i++) 
    if (listOfFiles[i].isFile()) 
        FilesDto returnDto = new FilesDto();
        returnDto.setFileName(FilenameUtils.removeExtension(listOfFiles[i].getName()));

        File file = new File("filename");
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
        FileLock lock;
        try 
            lock = channel.tryLock();
         catch (OverlappingFileLockException e) 
            // File is already locked 
        

        if (lock==null) 
            returnDto.setStatus("unlocked");
            returnDto.setFilePath(listOfFiles[i].getAbsolutePath());

         else 
            lock.release();
            returnDto.setStatus("Locked");
        

        returnDtoList.add(returnDto);
    

【讨论】:

以上是关于java中的文件锁定的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO基础3文件锁

java核心学习(十九) javaNIO框架---文件锁

SQL SERVER的锁机制——概述(锁的兼容性与可以锁定的资源)

SylixOS文件记录锁使用

perf 是不是锁定配置文件用户空间互斥锁?

JAVA 并发编程-读写锁之模拟缓存系统