利用Java實現(xiàn)文件鎖定功能
題目描述-文件鎖定功能
1.題目
在操作文件時,有時會遇到一個問題:該文件已經(jīng)被另一個程序占用,打開失敗。這是因為另一個程序在編輯此文件。
實現(xiàn):對D盤的xiaoxuzhu.txt文件進行鎖定1分鐘,1分鐘后解鎖。
2.解題思路
創(chuàng)建一個類:EncryptInput
使用FileChannel類的tryLock()獲取文件鎖定,如果沒獲取到文件鎖,會返回null??梢酝ㄟ^這個返回值判斷是否有沒有被鎖定。
FileLock 一般都是從FileChannel 中獲取
FileLock 是文件鎖,它能保證同一時間只有一個進程(程序)能夠修改它,或者都只可以讀,這樣就解決了多進程間的同步文件,保證了安全性。但是需要注意的是,它進程級別的,不是線程級別的,他可以解決多個進程并發(fā)訪問同一個文件的問題,但是它不適用于控制同一個進程中多個線程對一個文件的訪問。這也是為什么它叫做 多進程文件鎖,而不是 多線程文件鎖。
3.代碼詳解
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 xiaoxuzhu 2022/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 xiaoxuzhu 2022/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);
}
}



多學(xué)一個知識點
new一個FileOutputStream對象時,如果file文件內(nèi)容本身存在,會清空數(shù)據(jù)。
new FileOutputStream(file);
如果不要清空數(shù)據(jù),可以使用
= new FileOutputStream(file,true);
到此這篇關(guān)于利用Java實現(xiàn)文件鎖定功能的文章就介紹到這了,更多相關(guān)Java文件鎖定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決springboot application.properties server.port配置問題
這篇文章主要介紹了解決springboot application.properties server.port配置問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Netty源碼解析NioEventLoop創(chuàng)建的構(gòu)造方法
這篇文章主要介紹了Netty源碼解析NioEventLoopGroup之NioEventLoop創(chuàng)建的構(gòu)造方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
java 二進制數(shù)據(jù)與16進制字符串相互轉(zhuǎn)化方法
今天小編就為大家分享一篇java 二進制數(shù)據(jù)與16進制字符串相互轉(zhuǎn)化方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Java實現(xiàn)多級表頭和復(fù)雜表頭的導(dǎo)出功能
這篇文章主要為大家詳細介紹了Java實現(xiàn)多級表頭和復(fù)雜表頭的導(dǎo)出功能的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
java實現(xiàn)將數(shù)字轉(zhuǎn)換成人民幣大寫
前面給大家介紹過使用javascript,php,c#,python等語言實現(xiàn)人民幣大寫格式化,這篇文章主要介紹了java實現(xiàn)將數(shù)字轉(zhuǎn)換成人民幣大寫的代碼,非常的簡單實用,分享給大家,需要的朋友可以參考下2015-04-04

