java file-locking filelock

Java FileLock para lectura y escritura



file-locking (2)

Tengo un proceso que será llamado con bastante frecuencia por parte de cron para leer un archivo que tiene ciertos comandos relacionados con el movimiento. Mi proceso necesita leer y escribir en este archivo de datos, y mantenerlo bloqueado para evitar que otros procesos lo toquen durante este tiempo. Un usuario puede ejecutar un proceso completamente separado para (potencial) escribir / adjuntar a este mismo archivo de datos. Quiero que estos dos procesos se reproduzcan y solo accedan al archivo uno a la vez.

El nio FileLock parecía ser lo que necesitaba (además de escribir mis propios archivos de tipo semáforo), pero tengo problemas para bloquearlo para leer. Puedo bloquear y escribir muy bien, pero cuando intento crear un bloqueo al leer, obtengo una excepción NonWritableChannelException. ¿Es incluso posible bloquear un archivo para leer? Parece que un RandomAccessFile está más cerca de lo que necesito, pero no veo cómo implementar eso.

Aquí está el código que falla:

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()); ...

La excepción se lanza en la línea 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 cuanto a los JavaDocs, dice

Excepción no marcada lanzada cuando se intenta escribir en un canal que no se abrió originalmente para escribir.

Pero no necesariamente tengo que escribirle. Cuando intento crear un FileOutpuStream, etc. con fines de escritura, queda satisfecho hasta que intento abrir un FileInputStream en el mismo archivo.


(a) ¿Es consciente de que bloquear el archivo no impedirá que otros procesos lo toquen a menos que también usen bloqueos?
(b) Tienes que bloquear a través de un canal grabable. Obtenga el bloqueo a través de un RandomAccessFile en modo "rw" y luego abra su FileInputStream . Asegúrate de cerrar ambos!


Sería mejor si creara el bloqueo utilizando tryLock(0L, Long.MAX_VALUE, true) .

Esto crea un bloqueo compartido que es lo correcto para la lectura.

tryLock() es una abreviatura de tryLock(0L, Long.MAX_VALUE, false) , es decir, solicita un bloqueo de escritura exclusivo.