Проверьте, заблокирован ли файл в Java - PullRequest
21 голосов
/ 30 сентября 2009

Моя Java-программа хочет прочитать файл, который может быть заблокирован другой программой, записывающей в него. Мне нужно проверить, заблокирован ли файл, и если да, дождаться его освобождения. Как мне этого добиться?

Программа на Java работает на сервере Windows 2000.

Ответы [ 8 ]

29 голосов
/ 04 декабря 2012

Должно работать в Windows:

File file = new File("file.txt");
boolean fileIsNotLocked = file.renameTo(file);
13 голосов
/ 01 октября 2009

В Windows с Sun JVM FileLocks должны работать должным образом, хотя JavaDocs оставляют надежность довольно неопределенной (зависит от системы).

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

File f = new File("some-locked-file.txt");
System.out.println(f.canWrite()); // -> true
new FileOutputStream(f); // -> throws a FileNotFoundException

Это довольно странно, но если вы не учитываете слишком высокую независимость от платформы и ваша система демонстрирует такое же поведение, вы можете объединить это в служебную функцию.

С текущими версиями Java, к сожалению, нет способа получить информацию об изменениях состояния файла, поэтому, если вам нужно подождать, пока файл не будет записан, вы должны время от времени пытаться проверить, не был ли запущен другой процесс. его замок. Я не уверен, но с Java 7 можно было бы использовать новый WatchService, чтобы получать информацию о таких изменениях.

5 голосов
/ 30 сентября 2009

Используйте FileLock во всех Java-приложениях, использующих этот файл, чтобы они запускались в одной и той же JVM. В противном случае это невозможно сделать надежно.

2 голосов
/ 04 февраля 2015

Лучший способ - использовать FileLock, но в моем случае (jdk 1.6) я попытался с успехом:

public static boolean isFileUnlocked(File file) {
        try {
            FileInputStream in = new FileInputStream(file);
            if (in!=null) in.close();
            return true;
        } catch (FileNotFoundException e) {
            return false;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return true;
    }
2 голосов
/ 05 апреля 2011

Вы можете попытаться получить эксклюзивную блокировку файла. Пока исключительная блокировка не может быть получена, другая программа имеет блокировку (эксклюзивную или общую) для файла.

2 голосов
/ 30 сентября 2009

Если файл может использоваться несколькими процессами (которые могут быть смесью Java и не-Java), используйте FileLock. Ключ к успешному использованию блокировок файлов - помнить, что они только «рекомендательные». Блокировка гарантированно будет видимой, если вы проверите ее, но она не помешает вам что-то сделать с файлом, если вы забудете. Все процессы, которые обращаются к файлу, должны быть разработаны для использования протокола блокировки.

0 голосов
/ 22 мая 2018

Улучшенный ответ Амджада Абдул-Гани, я обнаружил, что никакой ошибки не возникало до попытки чтения из файла

public static boolean isFilelocked(File file) {
     try {
         try (FileInputStream in = new FileInputStream(file)) {
             in.read();
             return false;
         }
     } catch (FileNotFoundException e) {
         return file.exists();
     } catch (IOException ioe) {
         return true;
     }
 }
0 голосов
/ 28 декабря 2017

Проверено только на Windows: Вы можете проверить, заблокирован ли файл, следующим образом: venergiac : проверка на наличие (file.exist ()) файла существует, но с помощью FileNotFoundException означает, что заблокирован! вы заметите это сообщение (процесс не может получить доступ к файлу, потому что он используется другим процессом)

        public static boolean isFilelocked(File file) {
                try {

                    FileInputStream in = new FileInputStream(file);
                    in.close();
                    return false;
                } catch (FileNotFoundException e) {
                    if(file.exist()){ 
                       return true;
                     }
                     return false;
                } catch (Exception e) {
                    e.printStackTrace();
                }

                return false;
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...