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

时间:2014-03-21 21:07:26

标签: 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 = 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();

我在调试器中看到了这张照片: enter image description here 下一步将带我进入NonWritableChannelException。

我无法理解为什么我试图锁定文件进行阅读。 任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

javadoc给出答案。您使用.lock(),这相当于调用.lock(0L, Long.MAX_VALUE, false)

第三个参数,一个布尔值,被描述为(强调我的):

  

如果要求共享锁,则为true,在这种情况下,必须打开此通道才能读​​取(并可能写入); false 请求独占锁定,在这种情况下此频道必须打开才能写入(并可能会阅读)

您必须.lock(0L, Long.MAX_VALUE, true)


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

答案 1 :(得分:0)

你还需要在这里锁定可写通道,以便制作你的代码,

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

这应该有用。