利用Java实现文件锁定功能

 更新时间:2022年08月11日 15:22:11   作者:小虚竹and掘金  
这篇文章主要为大家详细介绍了如何利用Java语言实现文件锁定功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

题目描述-文件锁定功能

1.题目

在操作文件时,有时会遇到一个问题:该文件已经被另一个程序占用,打开失败。这是因为另一个程序在编辑此文件。

实现:对D盘的xiaoxuzhu.txt文件进行锁定1分钟,1分钟后解锁。

2.解题思路

创建一个类:EncryptInput

使用FileChannel类的tryLock()获取文件锁定,如果没获取到文件锁,会返回null。可以通过这个返回值判断是否有没有被锁定。

FileLock 一般都是从FileChannel 中获取

FileLock 是文件锁,它能保证同一时间只有一个进程(程序)能够修改它,或者都只可以读,这样就解决了多进程间的同步文件,保证了安全性。但是需要注意的是,它进程级别的,不是线程级别的,他可以解决多个进程并发访问同一个文件的问题,但是它不适用于控制同一个进程中多个线程对一个文件的访问。这也是为什么它叫做 多进程文件锁,而不是 多线程文件锁

3.代码详解

EncryptInput类

package com.xiaoxuzhu;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileLock;

/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create
 * </pre>
 * @date 2022/5/3
 */

public class EncryptInput {

    @SuppressWarnings("unused")
    public static void fileLock(String file) {
        FileOutputStream fous = null; // 创建FileOutputStream对象
        FileLock lock = null; // 创建FileLock对象
        try {
            fous = new FileOutputStream(file,true); // 实例化FileOutputStream对象
           
            lock = fous.getChannel().tryLock(); // 获取文件锁定
            if(lock==null){
                //不需要处理了
                return;
            }
            String str = "虚竹哥好帅";
            IoUtil.write(fous, CharsetUtil.UTF_8,Boolean.FALSE,str);
            Thread.sleep(60 * 1000); // 线程锁定1分钟
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(lock!=null){
                    lock.release();
                }
                System.out.println("文件解锁");
                IoUtil.close(fous);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        System.out.println("对 D://xiaoxuzhu1.txt 的文件进行锁定");
        // 创建文件对象
        String file = "D://xiaoxuzhu1.txt";
        // 调用文件锁定方法
        fileLock(file); 
    }
}

EncryptInput2类:测试是否锁定了文件

package com.xiaoxuzhu;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileLock;

/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create
 * </pre>
 * @date 2022/5/3
 */

public class EncryptInput2 {

    @SuppressWarnings("unused")
    public static void fileLock(String file) {
        FileOutputStream fous = null; // 创建FileOutputStream对象
        FileLock lock = null; // 创建FileLock对象
        try {
            fous = new FileOutputStream(file,true); // 实例化FileOutputStream对象
           
            lock = fous.getChannel().tryLock(); // 获取文件锁定
            if(lock==null){
                //不需要处理了
                System.out.println("没有获取到文件锁,此文件已被锁定");
                return;
            }
            String str = "虚竹哥57好帅";
            IoUtil.write(fous, CharsetUtil.UTF_8,Boolean.FALSE,str);
            Thread.sleep(60 * 1000); // 线程锁定1分钟
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(lock!=null){
                    lock.release();
                }
                IoUtil.close(fous);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        System.out.println("对 D://xiaoxuzhu1.txt 的文件进行锁定");
        // 创建文件对象
        String file = "D://xiaoxuzhu1.txt";
        // 调用文件锁定方法
        fileLock(file); 
        
    }
}

多学一个知识点

new一个FileOutputStream对象时,如果file文件内容本身存在,会清空数据。

new FileOutputStream(file); 

如果不要清空数据,可以使用

= new FileOutputStream(file,true);

到此这篇关于利用Java实现文件锁定功能的文章就介绍到这了,更多相关Java文件锁定内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中如何动态创建接口的实现方法

    Java中如何动态创建接口的实现方法

    这篇文章主要介绍了Java中如何动态创建接口的实现方法的相关资料,需要的朋友可以参考下
    2017-09-09
  • SpringBoot 如何优雅的实现跨服务器上传文件的示例

    SpringBoot 如何优雅的实现跨服务器上传文件的示例

    这篇文章主要介绍了SpringBoot 如何优雅的实现跨服务器上传文件的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2006-11-11
  • Mac配置 maven以及环境变量设置方式

    Mac配置 maven以及环境变量设置方式

    这篇文章主要介绍了Mac配置 maven以及环境变量设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • java 字符串截取的实例详解

    java 字符串截取的实例详解

    这篇文章主要介绍了java 字符串截取的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Java自带消息队列Queue的使用教程详细讲解

    Java自带消息队列Queue的使用教程详细讲解

    这篇文章主要介绍了Java自带消息队列Queue的使用教程,Java中的queue类是队列数据结构管理类,在它里边的元素可以按照添加它们的相同顺序被移除,队列通常以FIFO的方式排序各个元素,感兴趣想要详细了解可以参考下文
    2023-05-05
  • 关于properties配置文件的加密方式

    关于properties配置文件的加密方式

    这篇文章主要介绍了关于properties配置文件的加密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Spring中的循环依赖详解

    Spring中的循环依赖详解

    这篇文章主要介绍了Spring中的循环依赖详解,  Spring 框架是一个流行的Java应用程序框架,它提供了许多强大的功能,如依赖注入和面向切面编程,然而在使用 Spring 框架时,我们可能会遇到循环依赖的问题,需要的朋友可以参考下
    2023-09-09
  • springBoot快速访问工程目录下的静态资源

    springBoot快速访问工程目录下的静态资源

    springboot工程,是没有webapp文件夹的,静态文件放在src/main/resources/static文件夹下即可,模板文件放在src/main/resources/templates下,本文给大家介绍springBoot快速访问工程目录下的静态资源的相关知识,一起看看吧
    2021-06-06
  • Java super关键字的使用详解

    Java super关键字的使用详解

    java中的super关键字是一个引用变量,用于引用直接父类对象,下面这篇文章主要给大家介绍一下super关键字的使用,需要的朋友可以参考下
    2022-07-07
  • 使用Java实现简单串口通信

    使用Java实现简单串口通信

    这篇文章主要介绍了使用Java实现简单串口通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论