文件锁
使用文件锁要用到FileLock类
和FileChannel类
,并且结合随机流RandomAccessFile类
进行使用
RandomAccessFile创建的流在读/写文件时可以使用文件锁,只要不解除该锁,那么其他程序就无法对被锁的文件进行操作
使用文件锁
- 先试用
RandomAccessFile
流建立指向文件的流对象,模式必须是"rw"
RandomAccessFile input = new RandomAccessFile("Example.java","rw");
- input调用方法
getChannel()
获得一个连接到底层文件的FileChannel
对象(信道)
FileChannel channel = input.getChannel();//获取文件的通道,放到通道对象中
- 信道调用
tryLock()
或lock()
方法获得一个FileLock
(文件锁),这个过程就叫文件加锁
FileLock lock = channel.tryLock();//将通道进行关闭后放到一个锁对象
- 当文件加锁后将禁止任何应用程序对文件进行操作或在进行加锁,如果想读写文件那么必须要先解锁
lock.release();//对文件进行解锁
对文件进行加锁的例子
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class myWindow extends JFrame implements ActionListener {
JButton jButton;
JTextArea jTextArea;
File file;
FileChannel fileChannel;
FileLock fileLock;
RandomAccessFile randomAccessFile;
myWindow(){
setTitle("文件锁");
setBounds(300,300,500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
init();
validate();
}
void init(){
jTextArea = new JTextArea();
add(new JScrollPane(jTextArea), BorderLayout.CENTER);
jButton = new JButton("输入一行");
jButton.addActionListener(this); //设置监视器
add(jButton,BorderLayout.SOUTH);
try{
file = new File("C:\\Users\\Administrator\\Desktop","首页文案.txt");
randomAccessFile = new RandomAccessFile(file,"rw");
fileChannel = randomAccessFile.getChannel(); //获取文件的通道
fileLock = fileChannel.tryLock(); //通道上锁后放到锁对象中
}
catch(Exception E){
}
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
try{
fileLock.release();
String s = randomAccessFile.readLine(); //将读取的每一行放到字符串中
byte b [] = s.getBytes("ISO-8859-1"); //转换编码,否者会出现乱码
String content = new String(b);
jTextArea.append("\n" + content); //读取的一行放到文本框中
fileLock = fileChannel.tryLock();
if (s == null)
randomAccessFile.close();
}
catch(Exception e){
}
}
}
public class Example12_16 {
public static void main(String[] args) {
myWindow myWindow = new myWindow();
}
}
运行效果图
解决乱码的问题
RandomAccessFile流调用readLine()方法时读取含有非ASCII字符的文件时就会出现乱码,因为有文字的存在,所以要解决这个问题就要将读到的字符串重新编码然后放到一个byte数组中
- 获取每一行字符串后
String str = in.readLine(); //获取字符串
- 用ISO-8859-1重新编码
byte b [ ] = str.getBytes("ISO-8859-1"); //重新编码
- 使用当前计算机的默认编码将字节数数组转化为字符串
String content = new String(b);
- 最后输出的content就不会是乱码了