經常出現幾個程式處理同一個檔案的情景,例如同時更新或讀取檔案。應對這樣的問題做出處理,否則可能會發生混亂。 JDK 1.4版本後,Java提供了檔案鎖定功能,可以協助解決這樣的問題。
FileLock和FileChannel類別分別在java.nio和java.nio.channels套件中。輸入、輸出流讀寫檔案時可以使用檔案鎖,以下結合RandomAccessFile類別來說明檔案鎖的使用方法。
RandomAccessFile所建立的流程在讀寫檔案時可以使用檔案鎖定,那麼只要不解除該鎖定,其他程式就無法操作已鎖定的檔案。
使用文件鎖的步驟如下:
1)先使用RandomAccessFile流建立指向檔案的流對象,該對象的讀寫屬性必須是rw,例如:
RandomAccessFileinput=newRandomAccessFile(Main.java,rw);
2)input流呼叫方法getChannel()取得一個連接到底層檔案的FileChannel物件(頻道),例如:
FileChannelchannel=input.getChannel();
3)頻道呼叫tryLock()或lock()方法取得一個FileLock(檔案鎖)對象,此過程也稱為做對檔案加鎖,例如:
FileLocklock=channel.tryLock();
文件鎖物件產生後,將禁止任何程序對文件進行操作或再進行加鎖。對一個檔案加鎖之後,如果想讀、寫檔案必須讓FileLock物件呼叫release()釋放檔案鎖,例如:
lock.release();
例如,Java程式透過每次單擊按鈕釋放檔案鎖,並讀取檔案中的一行文本,然後馬上進行加鎖。當Java程式運作時,使用者無法用其他程式來操作被目前Java程式加鎖的文件,例如使用者使用Windows作業系統提供的「記事本」程式(Notepad.exe)無法儲存目前Java程式加鎖的文件。
Main.java
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(Main.java);WindowFileLockwin=newWindowFileLock(file);win.setTitle(使用檔案鎖定);}}
WindowFileLock.java
importjava.io.*;importjava.nio.*;importjava.nio.channels.*;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassWindowFileLockextendsJframeimplementsListener{JJTextAreatext;Jbtton FileChannelchannel;FileLocklock;WindowFileLock(Filef){file=f;try{input=newRandomAccessFile(file,rw);channel=input.getChannel();lock=channel.tryLock();}catch(Exceptionexp){}text=newJTextArea ();button=newJButton(讀取一行);button.addActionListener(this);add(newJScrollPane(text),BorderLayout.CENTER);add(button,BorderLayout.SOUTH);setSize(300,400);setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){try{lock.release();StringlineString=input.readLine();text.append(n+lineString);lock=chan.tryLock();if(lineString ==null)input.close();}catch(Exceptionee){}}}