java 目前还不允许锁"只读通道"
FileInputStream 是只读, 所以不能锁
如果是 FileOutputStream 应该可以这点感觉 java 的规定有点死板...如果你非要锁的话, 就需要用到 RandomAccessFile 了...
FileInputStream 是只读, 所以不能锁
如果是 FileOutputStream 应该可以这点感觉 java 的规定有点死板...如果你非要锁的话, 就需要用到 RandomAccessFile 了...
调试欢乐多
你在外部自己加一个Object monitor..
你要读取的时候就synchronized(monitor){读}
写的时候也对synchonized(monitor){写。。}
即使在读的时候也不会有脏数据,大家认为呢?
还有RandomAccessFile那里我有点不知道其用途,rgistered(已注册) 你一般怎么用啊?
这个除了锁文件一般是没有办法控制的RandomAccessFile raf = new RandomAccessFile("myFile", "rw");
raf.getChannel().lock();
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.nio.channels.FileLock;import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class JDomReader { public static void main(String[] args){
int i = 1;
FileLock lock = null;
while(true){
try{
String f = "C:\\JDomTest.xml"; RandomAccessFile rf = new RandomAccessFile(f, "rw");
lock = rf.getChannel().lock();
FileDescriptor fd = rf.getFD();
FileInputStream fileStream = new FileInputStream(fd); SAXBuilder builder = new SAXBuilder();
Document readDoc = builder.build(new InputStreamReader(fileStream, "UTF-16"));
i++;
if(rf != null){
rf.close();
}
if(fileStream != null){
fileStream.close();
}
if(lock != null && lock.isValid()){
lock.release();
}
Object obj = new Object();
synchronized(obj){
obj.wait(100);
}
} catch (JDOMException e1) {
// TODO Auto-generated catch block
} catch (IOException e1) {
// TODO Auto-generated catch block
} catch (InterruptedException e) {
// TODO Auto-generated catch block
}
}
}
}
但是在
if(lock != null && lock.isValid()){
lock.release();
}
中出现如下错误:
java.io.IOException: ハンドルが無効です。
at sun.nio.ch.FileChannelImpl.release0(Native Method)
at sun.nio.ch.FileChannelImpl.release(FileChannelImpl.java:791)
at sun.nio.ch.FileLockImpl.release(FileLockImpl.java:35)
at test.JDomReader.main(JDomReader.java:57)该怎么解决呢?
fileStream.close();
}
if(lock != null && lock.isValid()){
lock.release();
}
你这个写翻了
因为你已经把文件关闭了, 锁自然也就解除了
可改为
if(lock != null && lock.isValid()){
lock.release();
}
if(fileStream != null){
fileStream.close();
} 还有就是总感觉你这个程序有点不得劲
前面大家说的都有道理,如果你是单进程执行的话最好用同步
如果是只读根本没有必要加锁
加锁的目的就是为了避免其他进程"写"同一文件
主要不太理解你"有多个进程操作一个xml文件"是何打算...