131 votes

Comment puis-je verrouiller un fichier en utilisant Java (si possible)

J'ai un processus java qui s'ouvre un fichier à l'aide d'un FileReader. Comment puis-je empêcher un autre (java) pour ouvrir ce fichier, ou au moins faire en sorte que le deuxième processus de savoir que le fichier est déjà ouvert? Est-ce à automatiquement fait le deuxième processus d'obtenir une exception si le fichier est ouvert(ce qui résout mon problème) ou dois-je explicitement l'ouvrir dans le premier de ces processus avec une sorte de drapeau ou de l'argument?

Pour clarifier:

J'ai une application java qui contient un dossier et ouvre chaque fichier dans la liste pour le traitement. Il traite chaque fichier après l'autre. Le traitement de chaque fichier est constitué de le lire et de faire quelques calculs basés sur le contenu et il faut environ 2 minutes. J'ai aussi une autre application java qui fait la même chose mais au lieu de cela écrit sur le fichier. Ce que je veux, c'est être en mesure d'exécuter ces applications en même temps si le scénario va comme ceci. ReadApp répertorie le dossier et recherche des fichiers A, B, C. Il ouvre Un fichier et commence la lecture. WriteApp répertorie le dossier et recherche des fichiers A,B, C, Il ouvre le fichier A voit qui est ouvert (par une exception ou d'une quelque manière que ce soit) et va au fichier B. ReadApp finitions fichier Un et continue à B. Il voit qu'il est ouvert et continue à C. Il est crucial que WriteApp ne pas écrire tout en ReadApp est la lecture du même fichier ou vice versa. Ils sont différents processus.

122voto

FileChannel.lock est probablement ce que vous voulez.

 FileInputStream in = new FileInputStream(file);
try {
    java.nio.channels.FileLock lock = in.getChannel().lock();
    try {
        Reader reader = new InputStreamReader(in, charset);
        ...
    } finally {
        lock.release();
    }
} finally {
    in.close();
}
 

(Avertissement: Code non compilé et certainement pas testé.)

Notez la section intitulée "dépendances de plate-forme" dans la documentation de l'API pour FileLock.

64voto

ayengin Points 744

N'utilisez pas les classes du package java.io , utilisez plutôt le package java.nio . Ce dernier a une classe FileLock . Vous pouvez appliquer un verrou à FileChannel .

  try {
        // Get a file channel for the file
        File file = new File("filename");
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

        // Use the file channel to create a lock on the file.
        // This method blocks until it can retrieve the lock.
        FileLock lock = channel.lock();

        /*
           use channel.lock OR channel.tryLock();
        */

        // Try acquiring the lock without blocking. This method returns
        // null or throws an exception if the file is already locked.
        try {
            lock = channel.tryLock();
        } catch (OverlappingFileLockException e) {
            // File is already locked in this thread or virtual machine
        }

        // Release the lock
        lock.release();

        // Close the file
        channel.close();
    } catch (Exception e) {
    }
 

18voto

KC Baltz Points 655

Si vous pouvez utiliser Java NIO (JDK 1.4 ou supérieur), alors je pense que vous recherchez java.nio.channels.FileChannel.lock ()

FileChanel.lock ()

8voto

Matt Points 1447

5voto

pkaeding Points 12935

Cela peut ne pas être ce que vous cherchez, mais dans l'intérêt de venir à un problème sous un autre angle....

Ce sont ces deux Java processus qui pourraient vouloir accéder au même fichier dans la même application? Vous pouvez peut-être juste de filtrer tous les accès au fichier par l'intermédiaire d'un seul, méthode synchronisée (ou, encore mieux, à l'aide de la JSR-166)? De cette façon, vous pouvez contrôler l'accès au fichier, et peut-être même de la file d'attente des demandes d'accès.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X