Tengo un proceso que se llamará con bastante frecuencia de cron para leer un archivo que tiene ciertos comandos relacionados con movimiento en él. 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 proceso completamente independiente puede ser ejecutado por un usuario para (potencial) escribir/anexar a este mismo archivo de datos. Quiero que estos dos procesos jueguen bien y solo accedan al archivo de a uno por vez.Java FileLock para leer y escribir
El nio FileLock parecía ser lo que necesitaba (salvo escribir mis propios archivos de tipo de semáforo), pero tengo problemas para bloquearlo y leerlo. Puedo bloquear y escribir muy bien, pero cuando intento crear un bloqueo al leer, obtengo una NonWritableChannelException. ¿Es posible bloquear un archivo para leer? Parece que RandomAccessFile está más cerca de lo que necesito, pero no veo cómo implementarlo.
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 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 lanzado cuando se hace un intento de escribir en un canal que no se abrió originalmente para la escritura.
Pero no necesariamente necesito escribir en él. Cuando intento crear un FileOutpuStream, etc. para fines de escritura, me alegro hasta que intento abrir FileInputStream en el mismo archivo.
¿Ha intentado utilizar la llamada al método de tres param, bloqueo de FileLock (posición larga, tamaño largo, booleano compartido)? Nunca utilicé FileLock antes, así que no publicaré una respuesta, pero creo que usar ese método puede ser útil ya que parece que necesita un bloqueo compartido y no un bloqueo exclusivo, ya que desea escribir en el archivo mientras tiene un candado. – ChadNC
Creo que la intención de esto es bloquear solo partes de un archivo; sin embargo, me gustaría bloquear todo el archivo para evitar posibles daños. – bobtheowl2