回城傳送–》《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);
}
}




多學一個知識點
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