免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

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

文章目錄

零、前言

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

? 因?yàn)榇蠹叶荚谝黄饘W(xué)習(xí)同一篇文章,所以有什么問題都可以在群里問,群里的小伙伴可以迅速地幫到你,一個(gè)人可以走得很快,一群人可以走得很遠(yuǎn),有一起學(xué)習(xí)交流的戰(zhàn)友,是多么幸運(yùn)的事情。

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

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

一、題目描述

題目:在操作文件時(shí),有時(shí)會(huì)遇到一個(gè)問題:該文件已經(jīng)被另一個(gè)程序占用,打開失敗。這是因?yàn)榱硪粋€(gè)程序在編輯此文件。

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

二、解題思路

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

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

FileLock 一般都是從FileChannel 中獲取

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

三、代碼詳解

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對(duì)象
        FileLock lock = null; // 創(chuàng)建FileLock對(duì)象
        try {
            fous = new FileOutputStream(file,true); // 實(shí)例化FileOutputStream對(duì)象
           
            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("對(duì) D://xiaoxuzhu1.txt 的文件進(jìn)行鎖定");
        // 創(chuàng)建文件對(duì)象
        String file = "D://xiaoxuzhu1.txt";
        // 調(diào)用文件鎖定方法
        fileLock(file); 
    }
}

EncryptInput2類:測(cè)試是否鎖定了文件

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對(duì)象
        FileLock lock = null; // 創(chuàng)建FileLock對(duì)象
        try {
            fous = new FileOutputStream(file,true); // 實(shí)例化FileOutputStream對(duì)象
           
            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("對(duì) D://xiaoxuzhu1.txt 的文件進(jìn)行鎖定");
        // 創(chuàng)建文件對(duì)象
        String file = "D://xiaoxuzhu1.txt";
        // 調(diào)用文件鎖定方法
        fileLock(file); 
        
    }
}

多學(xué)一個(gè)知識(shí)點(diǎn)

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

 new FileOutputStream(file); 

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

= new FileOutputStream(file,true);

四、推薦專欄

《JAVA從零到壹》

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

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

五、示例源碼下載

關(guān)注下面的公眾號(hào),回復(fù)筑基+題目號(hào)

筑基57

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
一文讀懂Java之標(biāo)準(zhǔn)I/O流與文件
java 文件鎖
Java讀取文件加鎖代碼Demo(利用Java的NIO)
java中對(duì)IO文件的操作(讀,寫,增加一行,刪除一行,刪除文件
UTF-8, UTF-16, UTF-16LE, UTF-16BE的區(qū)別
NIO基礎(chǔ)操作
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服