Comment puis-je verrouiller un fichier à l'aide de 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) processus à partir de l'ouverture de ce fichier, ou au moins informer que le deuxième processus que le fichier est déjà ouvert? Le fait automatiquement) prendre la 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?
À préciser:
J'ai une application Java qui contient un dossier et ouvre chaque fichier dans la liste pour les traiter. 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. On ouvre Un fichier, 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.
- Voulez-vous dire par "processus" comme dans les processus de (deux machines virtuelles) ou du fil (même JVM). L'impact sur la réponse est d'une importance primordiale.
Vous devez vous connecter pour publier un commentaire.
FileChannel.verrou est probablement ce que vous voulez.
(Avertissement: Code non compilé et certainement pas testé.)
Remarque à la section intitulée "plate-forme de dépendances" dans la Doc API pour FileLock.
FileOutputStream
).FileOutputStream
ne va pas être d'une grande utilité pour uneReader
.NonWritableChannelException
, parce quelock()
tentatives pour acquérir un verrou exclusif, mais qui requiert un accès en écriture. Si vous avez un entrée stream, 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 lecture-écriture si vous voulez un verrou exclusif lors de la lecture... mais qui interdirait de lecteurs simultanés.lock(0L, Long.MAX_VALUE, true)
, paslock(0L, Long.MAX_VALUE, false)
. le dernier argument n'estboolean shared
docs.oracle.com/javase/8/docs/api/java/nio/channels/...Ne pas utiliser les classes de la
java.io
package, utilisez plutôt lejava.nio
paquet . Ce dernier a uneFileLock
classe. Vous pouvez appliquer un verrou à uneFileChannel
.RandomAccessFile
est dejava.io
...Si vous pouvez utiliser Java NIO (JDK 1.4 ou supérieure), alors je pense que vous êtes à la recherche pour
java.nio.channels.FileChannel.lock()
FileChannel.lock()
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
utilisation java.nio.les canaux.FileLock en conjonction avec java.nio.les canaux.FileChannel
Cela peut ne pas être ce que vous cherchez, mais dans l'intérêt de venir à un problème sous un autre angle....
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.
Utiliser un RandomAccessFile, c'est faire le canal, puis d'appeler lock(). La voie prévue par l'entrée ou la sortie ruisseaux n'ont pas suffisamment de privilèges pour verrouiller correctement. Assurez-vous d'appeler unlock() dans le bloc finally (fermeture du fichier n'est pas nécessairement libérer le verrou).
Ci-dessous est un échantillon extrait de code pour verrouiller un fichier jusqu'à ce que le processus est effectué par la JVM.