Pregunta

Tengo un proceso que se llama con frecuencia en lugar de cron para leer un archivo que ha comandos relacionados con cierto movimiento en el mismo. Mi proceso tiene que leer y escribir en este archivo de datos - y mantenerlo bloqueado para impedir que otros procesos tocarlo durante este tiempo. Un proceso completamente separado puede ser ejecutado por un usuario (potencial) escriba / anexar a este mismo archivo de datos. Quiero que estos dos procesos para jugar agradable y único acceso al archivo de uno a la vez.

El FileLock nio parecía ser lo que necesitaba (corto de escribir mis propios archivos de tipo semáforo), pero estoy teniendo problemas para abrir por la lectura. Puedo bloquear y escribir muy bien, pero al intentar crear bloqueo al leer Puedo obtener un NonWritableChannelException. ¿Es incluso posible bloquear un archivo para la lectura? Parece un RandomAccessFile está más cerca de lo que necesito, pero no veo cómo implementar eso.

Este es 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 produce 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, que dice

  

excepción no comprobada produce cuando se intenta escribir en un canal que no se abrió originalmente para la escritura.

Pero no necesariamente tienen que escribir en él. Cuando intento crear un FileOutpuStream, etc. para escritura es feliz hasta que intento abrir un FileInputStream en el mismo archivo.

¿Fue útil?

Solución

(a) ¿Sabe usted que el bloqueo del archivo no evitará que otros procesos de tocarlo a menos que también utilizan las cerraduras?
(B) Hay que bloquear a través de un canal de escritura. Obtener la cerradura a través de un RandomAccessFile en modo "rw" y abra el FileInputStream. Asegúrese de cerrar los dos!

Otros consejos

Sería mejor si ha creado el bloqueo con tryLock(0L, Long.MAX_VALUE, true).

Esto crea un bloqueo compartido que es lo que hay que hacer por la lectura.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top