java中FileLock使用异常问题
import java.io.File;
import java.io.FileInputStream;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class TestFileLock {
public static void main(String[] args) {
testFileLock();
}
public static void testFileLock(){
try{
File file = new File("d:\\test.xls");
if(!file.exists())
file.createNewFile()
while(true){
try{
//FileInputStream fis = new FileInputStream(file);
RandomAccessFile raf = new RandomAccessFile(file, "rw");
FileChannel fc = raf.getChannel();
FileLock fl = fc.lock();
if(fl.isValid())
System.out.println("locked");
fl.release();
System.out.println(fl.isValid());
break;
}catch(Exception e){
e.printStackTrace();
Thread.sleep(10);
}
}
System.out.println("while breaked...");
}catch(Exception e){
e.printStackTrace();
}
}
}
上面的程序为什么获取RandomAccessFile流通向底层文件的锁不会出现异常,假如RandomAccessFile换成
FileInputStream流也就是把try中的第一句去掉注释,第二句加注释,获取通道的对象该一下,就会出现
java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.lock(FileChannelImpl.java:969)
at java.nio.channels.FileChannel.lock(FileChannel.java:1052)
at filelockIO.TestFileLock.testFileLock(TestFileLock.java:35)
at filelockIO.TestFileLock.main(TestFileLock.java:19)
检查之后发现是 FileLock fl = fc.lock()这句话异常,为什么不能给字节输入流加文件锁???
------解决方案--------------------
FileLock 本来就是基于new io(nio) 的东西,而FileInputStream输入旧io的类。混用的话,会报错。