Java5 FileInputStream терпит неудачу, прежде чем я смогу получить блокировку файла

У меня есть приложение (Java5), распределенное между несколькими JVM, которое читает/записывает файлы из общего хранилища (хранилище управляется Windows). Я хотел использовать эксклюзивные/общие блокировки для записи/чтения файлов следующим образом:

    FileOutputStream fos = null;
    FileLock lock = null;
    ObjectOutputStream oos = null;
    try {
        fos = new FileOutputStream(new File("//share/test.dat"));  // HERE IT MAY THROW FileNotFoundException...
        lock = fos.getChannel().lock(); // ... and I won't acquire a lock.
        oos = new ObjectOutputStream(fos);
        oos.writeObject(value);
        return true;
    } catch (Exception e) {
        // Log it.
    } finally {
        // Close locks and I/O streams.
    }

Проблема: если JVM1 в данный момент читает файл test.dat, а JVM2 пытается записать в тот же файл, возникает исключение FileNotFoundException ("Процесс не может получить доступ к файлу, поскольку он используется другим процессом") будет выброшено на JVM2 в строке "new FileOutputStream(new File("//share/test.dat"))". Это похоже на случай Catch22: с одной стороны, я хочу получить блокировку, чтобы получить поток ввода-вывода; с другой стороны, мне нужно иметь поток ввода-вывода, чтобы получить блокировку. Как я мог видеть, такая же ситуация и с RandomAccessFile.

Любые идеи?..


person Lopotun    schedule 20.09.2012    source источник


Ответы (1)


Как видно из сообщения об ошибке, Windows просто не позволит вам сделать то, что вы пытаетесь сделать. Вы можете рассматривать саму ошибку Windows как состояние блокировки, если вы думаете об этом. В любом случае у вас будет родственная проблема из-за временного окна между открытием и блокировкой. Windows в каком-то смысле делает вам одолжение. Однажды.

person user207421    schedule 20.09.2012
comment
Означает ли это, что механизм блокировки файлов Java NIO бесполезен в Windows? т.е. Я никогда не получу блокировку файла, если файл в данный момент читается/записывается другим процессом. - person Lopotun; 20.09.2012
comment
@Lopotun Это означает, что в Windows уже есть механизм блокировки открытых файлов. Вам не нужно два. - person user207421; 20.09.2012
comment
Если да, то это очень важный момент. Я никогда не видел, чтобы это упоминалось явно раньше. Я хотел бы иметь более конкретное исключение для этого случая. Общее исключение FileNotFoundException сбивает с толку. - person Lopotun; 20.09.2012