Невозможно прочитать из недавно заблокированного файла

StackOverflow https://stackoverflow.com/questions/6345118

  •  27-10-2019
  •  | 
  •  

Вопрос

Поэтому я пытаюсь заблокировать файл, чтобы прочитать его, но я получил 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();
        }
    }
}

И я получил эту ошибку IOException: The process cannot access the file because another process has locked a portion of the file

Это было полезно?

Решение

Можно также добавить это в качестве ответа вместо комментария.

Если вы используете FileLock API Вам необходимо использовать соответствующие API файла NIO.

Другие советы

Воспроизводя мой ответ из Здесь (на случай, если это удаляется), и добавление отзывов Джеффа Фостера:

Учитывая, что экземпляр OverlappingFileLockException Исключение брошено, кажется, что другой поток в том же процессе пытается заблокировать один и тот же файл. Это не конфликт между A и B, а скорее конфликт в B, если кто -то идет по документации API на методе lock () и когда условие, при котором он бросает перекрытие FileLockexception:

Если блокировка, которая перекрывает запрошенную область, уже удерживается этой виртуальной машиной Java, или если в этом методе уже заблокирован другой поток и пытается заблокировать перекрывающуюся область того же файла

Единственное решение для предотвращения этого - иметь какой -либо другой поток в B, который не позволял приобрести блокировку в том же файле или ту же область перекрытия в файле.

А IOException Быть брошенным имеет немного более интересное сообщение. Это, вероятно, подтверждает приведенную выше теорию, но, не глядя на весь исходный код, я не могу ничего подтвердить. А lock Ожидается, что метод будет блокироваться до тех пор, пока не будет получен эксклюзивный замок. Если он был приобретен, то не должно быть проблем при чтении из файла. За исключением одного условия. Если файл уже открыт (и заблокирован) одним и тем же JVM в другом потоке, используя объект файла (или, другими словами, второй/другой дескриптор файла), то попытка прочитать в первом дескрипторе файла даже не удастся даже Если блокировка была получена (в конце концов, блокировка не блокирует другие потоки).

Улучшенный дизайн заключается в том, чтобы иметь один поток в каждом процессе, который приобретает эксклюзивную блокировку в файле (при использовании единого файлового объекта или одного дескриптора файла) только в течение определенного количества времени, выполните необходимую деятельность в Файл, а затем отпустите блокировку.

Как отметил Джефф, использование API NIO, вероятно, приведет к решению проблемы. Это полностью связано с Возможность открытия API FileReader Новый дескриптор файла, который отличается от того, что замок получен.

Может быть, то, что вы хотите, - это что -то большее:

FileInputStream fis = new FileInputStream(file);
channel = fis.getChannel();
channel.lock();
bufferedReader = new BufferedReader(new InputStreamReader(fis));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top