Java 尝试锁定文件以进行读取时的失望

Java 尝试锁定文件以进行读取时的失望,java,multithreading,Java,Multithreading,我试图让每个线程读取自己的txt文件 private void burden() { File mainFolder = new File("C:\\FilesToRead"); File[] files = mainFolder.listFiles(); String freeFile; for (File file : files) { FileChannel channel; FileLock lock = nul

我试图让每个线程读取自己的txt文件

   private void burden() {

    File mainFolder = new File("C:\\FilesToRead");
    File[] files = mainFolder.listFiles();
    String freeFile;

    for (File file : files) {

        FileChannel channel;
        FileLock lock = null;
        try {
            channel = new RandomAccessFile(file, "r").getChannel();;
            lock = channel.lock();
            // Ok. We get the lock
            readFile(file.getName());

        } catch (OverlappingFileLockException e) {
            continue; // File is open by someone else                 
        } catch (FileNotFoundException f) {

        } catch (IOException ex) {

        } catch (NonWritableChannelException n) {
            System.out.println("NonWritableChannelException");
        } finally {
            try {
                lock.release();
            } catch (IOException ex) {
                System.out.println("IOException!");
            }
        }

    }
} // burden();
我在调试器中看到以下图片: 下一步将介绍NonWritableChannelException

当我试图锁定文件以便阅读时,我不明白为什么。
任何帮助都将不胜感激。

javadoc给出了答案。使用
.lock()
,这相当于调用
.lock(0L,Long.MAX\u值,false)

第三个参数是布尔值,描述为(emphasis mine):

如果为true,则请求共享锁,在这种情况下,此通道必须打开以进行读取(可能还包括写入)false请求独占锁,在这种情况下,必须打开此通道以进行写入(也可能进行读取)

您必须
.lock(0L,Long.MAX\u值,true)



另外,如果您使用的是Java 7,请使用
FileChannel.open()

您还需要在此处锁定可写通道,以便生成代码

channel = new RandomAccessFile(file, "rw").getChannel();

这应该会起作用。

您应该显示异常。不要吞咽异常。某些outputstreams可能会修改此文件。因此也需要消除这种情况。锁仍然是建议性的;即使您有一个锁,也不会阻止另一个程序,甚至是当前JVM的线程打开文件进行写入。