经常出现几个程序处理同一个文件的情景,比如同时更新或读取文件。应对这样的问题做出处理,否则可能发生混乱。JDK 1.4版本后,Java提供了文件锁功能,可以帮助解决这样的问题。
FileLock和FileChannel类分别在java.nio和java.nio.channels包中。输入、输出流读写文件时可以使用文件锁,以下结合RandomAccessFile类来说明文件锁的使用方法。
RandomAccessFile创建的流在读写文件时可以使用文件锁,那么只要不解除该锁,其他程序无法操作被锁定的文件。
使用文件锁的步骤如下:
1)先使用RandomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw,例如:
RandomAccessFile input = new RandomAccessFile("Main.java","rw");2)input流调用方法getChannel()获得一个连接到底层文件的FileChannel对象(信道),例如:
FileChannel channel = input.getChannel();
3)信道调用tryLock()或lock()方法获得一个FileLock(文件锁)对象,这一过程也称做对文件加锁,例如:
FileLock lock = channel.tryLock();
文件锁对象产生后,将禁止任何程序对文件进行操作或再进行加锁。对一个文件加锁之后,如果想读、写文件必须让FileLock对象调用release()释放文件锁,例如:
lock.release();
例如,Java程序通过每次单击按钮释放文件锁,并读取文件中的一行文本,然后马上进行加锁。当Java程序运行时,用户无法用其他程序来操作被当前Java程序加锁的文件,比如用户使用Windows操作系统提供的“记事本”程序(Notepad.exe)无法保存被当前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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程