虽然用线程的synchronized方法也可以达到封锁的效果,但很多情况都会增强了程序的复杂性;现在介绍一种简单的类----
java.nio.channels.FileLock和
java.nio.channels.FileChannel;
java.io.FileInputStream,java.io.RandomAccessFile等类中都有一个可以得到FileChannel类(用于读取、写入、映射和操作文件的通道。
)的方法叫getChannel()(即public final FileChannel getChannel()),而FileChannel类下又有一个可以得到FileLock类(表示文件区域锁定的标记
)的方法叫tryLock()(即public final FileLock tryLock() throws IOException);现在把它们串起来,你大概想到怎样用文件锁了吧。。下面来看看我写的一个小程序,重点说明文件锁的用法。
package ccp330.gucheng.io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class FileLockTest {
public static void main(String[] args) {
File fdir=new File("D:/gucheng.txt");
try {
RandomAccessFile ranStream=new RandomAccessFile(fdir, "rw");
FileChannel channel=ranStream.getChannel();
FileLock lock=channel.tryLock();
String str=null;
while( ( str=( ranStream.readLine() ) ) != null){
str= new String(str.getBytes("ISO-8859-1"),"gb2312"); //此行用于处理双字节字符(例如:中文),单字节的字符可以不写。
System.out.println(str);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.release();
ranStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
File fdir=new File("D:/gucheng.txt");
try {
RandomAccessFile ranStream=new RandomAccessFile(fdir, "rw");
FileChannel channel=ranStream.getChannel();
FileLock lock=channel.tryLock();
String str=null;
while( ( str=( ranStream.readLine() ) ) != null){
str= new String(str.getBytes("ISO-8859-1"),"gb2312"); //此行用于处理双字节字符(例如:中文),单字节的字符可以不写。
System.out.println(str);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.release();
ranStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
转载于:https://blog.51cto.com/ccp330/115412