經(jīng)常出現(xiàn)幾個(gè)程序處理同一個(gè)文件的情景,比如同時(shí)更新或讀取文件。應(yīng)對(duì)這樣的問(wèn)題做出處理,否則可能發(fā)生混亂。JDK 1.4版本后,Java提供了文件鎖功能,可以幫助解決這樣的問(wèn)題。
FileLock和FileChannel類分別在java.nio和java.nio.channels包中。輸入、輸出流讀寫文件時(shí)可以使用文件鎖,以下結(jié)合RandomAccessFile類來(lái)說(shuō)明文件鎖的使用方法。
RandomAccessFile創(chuàng)建的流在讀寫文件時(shí)可以使用文件鎖,那么只要不解除該鎖,其他程序無(wú)法操作被鎖定的文件。
使用文件鎖的步驟如下:
1)先使用RandomAccessFile流建立指向文件的流對(duì)象,該對(duì)象的讀寫屬性必須是rw,例如:
RandomAccessFile input = new RandomAccessFile("Main.java","rw");
2)input流調(diào)用方法getChannel()獲得一個(gè)連接到底層文件的FileChannel對(duì)象(信道),例如:
FileChannel channel = input.getChannel();
3)信道調(diào)用tryLock()或lock()方法獲得一個(gè)FileLock(文件鎖)對(duì)象,這一過(guò)程也稱做對(duì)文件加鎖,例如:
FileLock lock = channel.tryLock();
文件鎖對(duì)象產(chǎn)生后,將禁止任何程序?qū)ξ募M(jìn)行操作或再進(jìn)行加鎖。對(duì)一個(gè)文件加鎖之后,如果想讀、寫文件必須讓FileLock對(duì)象調(diào)用release()釋放文件鎖,例如:
lock.release();
例如,Java程序通過(guò)每次單擊按鈕釋放文件鎖,并讀取文件中的一行文本,然后馬上進(jìn)行加鎖。當(dāng)Java程序運(yùn)行時(shí),用戶無(wú)法用其他程序來(lái)操作被當(dāng)前Java程序加鎖的文件,比如用戶使用Windows操作系統(tǒng)提供的“記事本”程序(Notepad.exe)無(wú)法保存被當(dāng)前Java程序加鎖的文件。
Main.java
import java.io.*; public class Main { public static void main(String args[]) { File file = new File("Main.java"); WindowFileLock win = new WindowFileLock(file); win.setTitle("使用文件鎖"); } }
WindowFileLock.java
import java.io.*; import java.nio.*; import java.nio.channels.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class WindowFileLock extends Jframe implements ActionListener { JTextArea text; JButton button; File file; RandomAccessFile input; FileChannel channel; FileLock lock; WindowFileLock(File f) { file = f; try { input = new RandomAccessFile(file,"rw"); channel = input.getChannel(); lock = channel.tryLock(); } catch(Exception exp) {} text = new JTextArea(); button = new JButton("讀取一行"); button.addActionListener(this); add(new JScrollPane(text),BorderLayout.CENTER); add(button,BorderLayout.SOUTH); setSize(300,400); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { try { lock.release(); String lineString = input.readLine(); text.append("\n"+lineString); lock = channel.tryLock(); if(lineString==null) input.close(); } catch(Exception ee) {} } }
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程