java 目前还不允许锁"只读通道"
FileInputStream 是只读, 所以不能锁
如果是 FileOutputStream 应该可以这点感觉 java 的规定有点死板...如果你非要锁的话, 就需要用到 RandomAccessFile 了...

解决方案 »

  1.   

    不知道这样可以不可以
     你在外部自己加一个Object monitor..
      你要读取的时候就synchronized(monitor){读}
      写的时候也对synchonized(monitor){写。。}
      
      

  2.   

    恩,我也赞成用楼上的方法,其实用魔书的方法以可以,用synchonized(this){...}
    即使在读的时候也不会有脏数据,大家认为呢?
    还有RandomAccessFile那里我有点不知道其用途,rgistered(已注册) 你一般怎么用啊?
      

  3.   

    关键问题不是本程序读写伤害, 问题在于其他进程是否会读写同一文件,
    这个除了锁文件一般是没有办法控制的RandomAccessFile raf = new RandomAccessFile("myFile", "rw");
    raf.getChannel().lock();
      

  4.   

    在不同java虚拟机中不能使用文件锁,要好锁服务
      

  5.   

    我认为registered(已注册) 是对的!明天试验一下,准备结贴了!
      

  6.   

    线程中的synchronized数据共享和代码共享的确很用呀!
      

  7.   

    to registered(已注册)还要有劳兄台,根据你的意见我对程序进行了修改,如下:
    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)该怎么解决呢?
      

  8.   

    if(fileStream != null){            
    fileStream.close();               
    }                                  
    if(lock != null && lock.isValid()){
    lock.release();                   
    }                                  
    你这个写翻了
    因为你已经把文件关闭了, 锁自然也就解除了
    可改为
    if(lock != null && lock.isValid()){
    lock.release();                   
    }                                  
    if(fileStream != null){            
    fileStream.close();               
    }                                  还有就是总感觉你这个程序有点不得劲
    前面大家说的都有道理,如果你是单进程执行的话最好用同步
    如果是只读根本没有必要加锁
    加锁的目的就是为了避免其他进程"写"同一文件
    主要不太理解你"有多个进程操作一个xml文件"是何打算...
      

  9.   

    我的程序是多进程读写同一个文件,所以需要这些必要的处理,感谢大家的帮助!感谢你 registered(已注册)