J'ai un processus qui sera appelé assez fréquemment à partir de cron pour lire un fichier qui contient certaines commandes liées au déplacement. Mon processus doit lire et écrire dans ce fichier de données - et le garder verrouillé pour empêcher d'autres processus de le toucher pendant ce temps. Un processus complètement séparé peut être exécuté par un utilisateur pour écrire/annexer (potentiellement) à ce même fichier de données. Je veux que ces deux processus jouent bien et n'accèdent au fichier qu'un seul à la fois. Le nl FileLock semblait être ce dont j'avais besoin (à part écrire mes propres fichiers de type sémaphore), mais j'ai du mal à le verrouiller en lecture. Je peux verrouiller et écrire très bien, mais lorsque je tente de créer un verrou en lisant, j'obtiens une exception NonWritableChannelException. Est-il même possible de verrouiller un fichier pour le lire? On dirait qu'un RandomAccessFile est plus proche de ce dont j'ai besoin, mais je ne vois pas comment implémenter cela.Java FileLock pour la lecture et l'écriture
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 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 n'ai pas nécessairement besoin d'écrire dessus. Lorsque j'essaie de créer un FileOutpuStream, etc. à des fins d'écriture, il est content jusqu'à ce que j'essaie d'ouvrir un FileInputStream sur le même fichier.
Avez-vous essayé d'utiliser l'appel de la méthode des trois paramètres, Verrouillage FileLock (position longue, taille longue, booléen partagé)? Je n'ai jamais utilisé le FileLock auparavant, je ne publierai donc pas de réponse, mais je pense que l'utilisation de cet appel de méthode peut aider car il semble que vous ayez besoin d'un verrou partagé et non d'un verrou exclusif. a un verrou dessus. – ChadNC
Je pense que l'intention de cela est de verrouiller seulement des parties d'un fichier, mais je voudrais verrouiller le fichier entier pour prévenir et une corruption possible. – bobtheowl2