J'ai un processus Java qui ouvre un fichier à l'aide d'un FileReader. Comment puis-je empêcher un autre processus (Java) d'ouvrir ce fichier, ou au moins informer ce deuxième processus que le fichier est déjà ouvert? Cela fait-il automatiquement au deuxième processus une exception si le fichier est ouvert (ce qui résout mon problème) ou dois-je l'ouvrir explicitement dans le premier processus avec une sorte d'indicateur ou d'argument?
Clarifier:
J'ai une application Java qui répertorie un dossier et ouvre chaque fichier dans la liste pour le traiter. Il traite chaque fichier après l'autre. Le traitement de chaque fichier consiste à le lire et à faire quelques calculs en fonction du contenu et cela prend environ 2 minutes. J'ai également une autre application Java qui fait la même chose mais qui écrit à la place sur le fichier. Ce que je veux, c'est pouvoir exécuter ces applications en même temps pour que le scénario se déroule comme suit. ReadApp répertorie le dossier et trouve les fichiers A, B, C. Il ouvre le fichier A et démarre la lecture. WriteApp répertorie le dossier et trouve les fichiers A, B, C.Il ouvre le fichier A, voit qu'il est ouvert (par une exception ou de quelque manière que ce soit) et va au fichier B.ReadApp termine le fichier A et continue vers B.Il voit qu'il est ouvert et continue vers C. Il est crucial que WriteApp ne le fasse pas t écrire pendant que ReadApp lit le même fichier ou vice versa. Ce sont des processus différents.
Réponses:
FileChannel.lock est probablement ce que vous voulez.
(Avertissement: Code non compilé et certainement pas testé.)
Notez la section intitulée "dépendances de la plate-forme" dans le document API pour FileLock .
la source
FileOutputStream
).FileOutputStream
ne sera pas très utile pour unReader
.NonWritableChannelException
, carlock()
tente d'acquérir un verrou exclusif, mais cela nécessite un accès en écriture. Si vous avez un flux d' entrée , vous pouvez utiliserlock(0L, Long.MAX_VALUE, false)
qui acquiert un verrou partagé et ne nécessite qu'un accès en lecture. Vous pouvez également utiliser unRandomAccessFile
ouvert en mode lecture-écriture si vous souhaitez un verrou exclusif lors de la lecture ... mais cela interdirait les lecteurs simultanés.lock(0L, Long.MAX_VALUE, true)
, nonlock(0L, Long.MAX_VALUE, false)
. le dernier argument estboolean shared
docs.oracle.com/javase/8/docs/api/java/nio/channels/…N'utilisez pas les classes du
java.io
package, utilisez plutôt lejava.nio
package. Ce dernier a uneFileLock
classe. Vous pouvez appliquer un verrou à un fichierFileChannel
.la source
Si vous pouvez utiliser Java NIO ( JDK 1.4 ou supérieur ), je pense que vous recherchez
java.nio.channels.FileChannel.lock()
FileChannel.lock ()
la source
File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine
utilisez java.nio.channels.FileLock conjointement avec java.nio.channels.FileChannel
la source
Ce n'est peut-être pas ce que vous recherchez, mais dans le but d'aborder un problème sous un autre angle ...
Ces deux processus Java peuvent-ils souhaiter accéder au même fichier dans la même application? Peut-être pouvez-vous simplement filtrer tous les accès au fichier via une seule méthode synchronisée (ou, mieux encore, en utilisant JSR-166 )? De cette façon, vous pouvez contrôler l'accès au fichier et peut-être même les demandes d'accès en file d'attente.
la source
Utilisez un RandomAccessFile, récupérez son canal, puis appelez lock (). Le canal fourni par les flux d'entrée ou de sortie ne dispose pas de privilèges suffisants pour se verrouiller correctement. Assurez-vous d'appeler unlock () dans le bloc finally (la fermeture du fichier ne libère pas nécessairement le verrou).
la source
Vous trouverez ci-dessous un exemple de code pour verrouiller un fichier jusqu'à ce que son processus soit effectué par JVM.
la source