高分求救——文件锁。
有多个进程操作一个xml文件,在写的时候使用文件锁使各文件操作互斥,但是我同时也希望在读的过程中将文件锁住,此时不能进行写的操作。于是写了如下程序,但是每次运行到 lock = fileStream.getChannel().lock();
就会出现如下错误提示:
java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.lock(FileChannelImpl.java:724)
at java.nio.channels.FileChannel.lock(FileChannel.java:865)
at test.JDomReader.main(JDomReader.java:39)
我怀疑是不是读的时候不能加独占锁呀?有没有什么方法解决读的过程中将文件锁住的问题呀!?
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.channels.FileLock;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
public class JDomReader {
public static void main(String[] args){
int i = 1;
FileLock lock = null;
while(true){
try{
String f = "C:\\JDomTest.xml";
File file = new File(f);
FileInputStream fileStream = new FileInputStream(f);
lock = fileStream.getChannel().lock();
SAXBuilder builder = new SAXBuilder();
Document readDoc = builder.build(new InputStreamReader(fileStream, "UTF-16"));
Element rootElement = readDoc.getRootElement();
System.out.println("it is the " + i + "th Read");
i++;
if(fileStream != null){
fileStream.close();
}
if(lock != null){
lock.release();
}
Object obj = new Object();
synchronized(obj){
obj.wait(100);
}
} catch (JDOMException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("Read");
System.exit(1);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("Read");
System.exit(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}