回城傳送–》《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);
}
}
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
聯(lián)系客服