Question

J'ai un processus qui sera appelé assez souvent de lire Cron un fichier qui a certaines commandes de déplacement liées à elle. Mon processus doit lire et écrire dans ce fichier de données - et le garder verrouillé pour empêcher que d'autres processus de le toucher pendant cette période. Procédé complètement séparé peut être exécuté par un utilisateur (potentiel) écrire / ajouter à ce même fichier de données. Je veux que ces deux processus pour jouer Nice et accéder au fichier un à la fois.

Le nio FileLock semblait être ce que je avais besoin (moins d'écrire mes propres fichiers de type sémaphores), mais je ne parviens pas verrouillant pour la lecture. Je peux écrire et verrouiller très bien, mais en essayant de créer de verrouillage lors de la lecture-je obtenir un NonWritableChannelException. Est-il même possible de verrouiller un fichier pour la lecture? On dirait un RandomAccessFile est plus proche de ce que je dois, mais je ne vois pas comment mettre en oeuvre.

Voici le code qui échoue:

FileInputStream fin = new FileInputStream(f);
FileLock fl = fin.getChannel().tryLock();
if(fl != null) 
{
  System.out.println("Locked File");
  BufferedReader in = new BufferedReader(new InputStreamReader(fin));
  System.out.println(in.readLine());
          ...

L'exception est levée sur la ligne de FileLock.

java.nio.channels.NonWritableChannelException
 at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
 at java.nio.channels.FileChannel.tryLock(Unknown Source)
 at Mover.run(Mover.java:74)
 at java.lang.Thread.run(Unknown Source)

En regardant les JavaDocs, il est dit

  

exception non vérifiée lancée lors d'une tentative d'écriture dans un canal qui n'a pas été ouvert à l'origine pour l'écriture.

Mais je ne dois pas nécessairement écrire. Lorsque je tente de créer un FileOutpuStream, etc. à des fins d'écriture, il est heureux jusqu'à ce que je tente d'ouvrir un FileInputStream sur le même fichier.

Était-ce utile?

La solution

(a) Savez-vous que le verrouillage du fichier ne gardera pas d'autres processus de toucher à moins qu'ils utilisent aussi des serrures
(B) Vous devez verrouiller par un canal inscriptible. Obtenez le verrouillage via un RandomAccessFile en mode « rw » puis ouvrez votre FileInputStream. Assurez-vous de fermer les deux!

Autres conseils

Il serait mieux si vous avez créé la serrure à l'aide tryLock(0L, Long.MAX_VALUE, true).

crée un verrou partagé qui est la bonne chose à faire pour la lecture.

tryLock() est un raccourci pour tryLock(0L, Long.MAX_VALUE, false), à savoir qu'il demande une écriture verrou exclusif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top