经常出现几个程序处理同一个文件的情景,比如同时更新或读取文件。应对这样的问题做出处理,否则可能发生混乱。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.*;publicclassWindowFileLockextendsJframeimplementsActionListener{JTextAreatext;JButtonbutton;Filefile;RandomAccessFileinput;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=channel.tryLock();if(lineString==null)input.close();}catch(Exceptionee){}}}