打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【第57题】输入、输出系列5-文件锁定功能
userphoto

2022.05.17 福建

关注

回城传送–》《JAVA筑基100例》

文章目录

零、前言

​ 今天是学习 JAVA语言 打卡的第57天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。

​ 因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

一、题目描述

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

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

二、解题思路

创建一个类:EncryptInput

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

FileLock 一般都是从FileChannel 中获取

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

三、代码详解

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    xiaoxuzhu2022/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    xiaoxuzhu2022/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从零到壹》第八讲:系统常用类

《Hutool实战》7hutool实战:FileUtil 文件工具类(100多个文件常用操作方法)

五、示例源码下载

关注下面的公众号,回复筑基+题目号

筑基57

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一文读懂Java之标准I/O流与文件
java 文件锁
Java读取文件加锁代码Demo(利用Java的NIO)
java中对IO文件的操作(读,写,增加一行,删除一行,删除文件
UTF-8, UTF-16, UTF-16LE, UTF-16BE的区别
NIO基础操作
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服