无法读取新锁定的文件

| 因此,我尝试锁定文件以进行读取,但是我得到了IOException,知道为什么吗?
public static void main(String[] args){
    File file = new File(\"C:\\\\dev\\\\harry\\\\data.txt\");

    FileReader fileReader = null;
    BufferedReader bufferedReader = null;
    FileChannel channel = null;
    FileLock lock = null;
    try{
        channel  = new RandomAccessFile(file, \"rw\").getChannel();
        lock = channel.lock();
        fileReader = new FileReader(file);
        bufferedReader = new BufferedReader(fileReader);
        String data;
        while((data = bufferedReader.readLine()) != null){
            System.out.println(data);
        }
    }catch(IOException e){
        e.printStackTrace();
    }finally{
        try {
            lock.release();
            channel.close();
            if(bufferedReader != null) bufferedReader.close();
            if(fileReader != null) fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
我得到这个错误error1ѭ     
已邀请:
        最好将其添加为答案而不是评论。 如果使用“ 2” API,则需要使用相应的NIO文件api。     
        从此处重现我的答案(以防万一它被删除),并添加Jeff Foster的反馈: 考虑到抛出了“ 3”异常的实例,看来同一进程中的另一个线程正在尝试锁定同一文件。这不是A与B之间的冲突,而是B中的冲突,如果有人通过lock()方法上的API文档以及在该条件下抛出OverlappingFileLockException的情况发生了:   如果锁与请求重叠   该Java已经拥有该区域   虚拟机,或者另一个线程   已被此方法阻止,并且   试图锁定重叠   同一文件的区域 防止这种情况的唯一解决方案是,阻止B中的任何其他线程获取同一文件或文件中相同重叠区域的锁。 抛出的ѭ4has消息更加有趣。它可能证实了上述理论,但是如果不查看整个源代码,我将无法确定任何内容。预期“ 5”方法将阻塞,直到获得排他锁为止。如果已获取,则从文件中读取应该没有问题。除了一种情况。如果该文件已经由同一JVM在另一个线程中使用File对象(或换句话说,第二个/不同的文件描述符)打开(并锁定),则尝试读取第一个文件描述符将失败如果获得了锁(毕竟,该锁不会锁定其他线程)。 一种改进的设计是,在每个进程中只有一个线程(仅在使用单个File对象或单个文件描述符的情况下)获得对文件的排他锁,仅持续一定的时间,然后在该进程中执行所需的活动。文件,然后释放锁定。 正如Jeff指出的那样,使用NIO API可能会解决问题。这完全是由于FileReader API可能会打开一个新的文件描述符,该文件描述符不同于获得该锁的文件描述符。     
        也许您想要的更像是:
FileInputStream fis = new FileInputStream(file);
channel = fis.getChannel();
channel.lock();
bufferedReader = new BufferedReader(new InputStreamReader(fis));
    

要回复问题请先登录注册