日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【第57題】輸入、輸出系列5-文件鎖定功能

 小虛竹 2022-05-17 發(fā)布于福建

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

文章目錄

零、前言

? 今天是學習 JAVA語言 打卡的第57天,每天我會提供一篇文章供群成員閱讀( 不需要訂閱付錢 ),讀完文章之后,按解題思路,自己再實現(xiàn)一遍。在小虛竹JAVA社區(qū) 中對應的 【打卡貼】打卡,今天的任務就算完成了。

? 因為大家都在一起學習同一篇文章,所以有什么問題都可以在群里問,群里的小伙伴可以迅速地幫到你,一個人可以走得很快,一群人可以走得很遠,有一起學習交流的戰(zhàn)友,是多么幸運的事情。

? 學完后,自己寫篇學習報告的博客,可以發(fā)布到小虛竹JAVA社區(qū) ,供學弟學妹們參考。

? 我的學習策略很簡單,題海策略+ 費曼學習法。如果能把這100題都認認真真自己實現(xiàn)一遍,那意味著 JAVA語言 已經(jīng)筑基成功了。后面的進階學習,可以繼續(xù)跟著我,一起走向架構師之路。

一、題目描述

題目:在操作文件時,有時會遇到一個問題:該文件已經(jīng)被另一個程序占用,打開失敗。這是因為另一個程序在編輯此文件。

實現(xiàn):對D盤的xiaoxuzhu.txt文件進行鎖定1分鐘,1分鐘后解鎖。

二、解題思路

創(chuàng)建一個類:EncryptInput

使用FileChannel類的tryLock()獲取文件鎖定,如果沒獲取到文件鎖,會返回null??梢酝ㄟ^這個返回值判斷是否有沒有被鎖定。

FileLock 一般都是從FileChannel 中獲取

FileLock 是文件鎖,它能保證同一時間只有一個進程(程序)能夠修改它,或者都只可以讀,這樣就解決了多進程間的同步文件,保證了安全性。但是需要注意的是,它進程級別的,不是線程級別的,他可以解決多個進程并發(fā)訪問同一個文件的問題,但是它不適用于控制同一個進程中多個線程對一個文件的訪問。這也是為什么它叫做 多進程文件鎖,而不是 多線程文件鎖。

三、代碼詳解

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>
 * 修改記錄:
 * 修改后版本        修改人修改日期修改內(nèi)容
 * 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; // 創(chuàng)建FileOutputStream對象
        FileLock lock = null; // 創(chuàng)建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 的文件進行鎖定");
        // 創(chuàng)建文件對象
        String file = "D://xiaoxuzhu1.txt";
        // 調(diào)用文件鎖定方法
        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>
 * 修改記錄:
 * 修改后版本        修改人修改日期修改內(nèi)容
 * 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; // 創(chuàng)建FileOutputStream對象
        FileLock lock = null; // 創(chuàng)建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 的文件進行鎖定");
        // 創(chuàng)建文件對象
        String file = "D://xiaoxuzhu1.txt";
        // 調(diào)用文件鎖定方法
        fileLock(file); 
        
    }
}

image-20220503200451145

image-20220503200505462

如圖

如圖

多學一個知識點

new一個FileOutputStream對象時,如果file文件內(nèi)容本身存在,會清空數(shù)據(jù)。

 new FileOutputStream(file); 

如果不要清空數(shù)據(jù),可以使用

= new FileOutputStream(file,true);

四、推薦專欄

《JAVA從零到壹》

《JAVA從零到壹》第八講:系統(tǒng)常用類

《Hutool實戰(zhàn)》7hutool實戰(zhàn):FileUtil 文件工具類(100多個文件常用操作方法)

五、示例源碼下載

關注下面的公眾號,回復筑基+題目號

筑基57

    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多