利用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> * 修改記錄: * 修改后版本 修改人 修改日期 修改內容 * 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"; // 調用文件鎖定方法 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> * 修改記錄: * 修改后版本 修改人 修改日期 修改內容 * 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"; // 調用文件鎖定方法 fileLock(file); } }
多學一個知識點
new一個FileOutputStream對象時,如果file文件內容本身存在,會清空數(shù)據(jù)。
new FileOutputStream(file);
如果不要清空數(shù)據(jù),可以使用
= new FileOutputStream(file,true);
到此這篇關于利用Java實現(xiàn)文件鎖定功能的文章就介紹到這了,更多相關Java文件鎖定內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中如何動態(tài)創(chuàng)建接口的實現(xiàn)方法
這篇文章主要介紹了Java中如何動態(tài)創(chuàng)建接口的實現(xiàn)方法的相關資料,需要的朋友可以參考下2017-09-09SpringBoot 如何優(yōu)雅的實現(xiàn)跨服務器上傳文件的示例
這篇文章主要介紹了SpringBoot 如何優(yōu)雅的實現(xiàn)跨服務器上傳文件的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2006-11-11