¿Cómo puedo bloquear un archivo usando Java (si es posible)?
Tengo un proceso Java que abre un archivo usando FileReader. ¿Cómo puedo evitar que otro proceso (Java) abra este archivo, o al menos notificar a ese segundo proceso que el archivo ya está abierto? ¿Esto hace que automáticamente el segundo proceso obtenga una excepción si el archivo está abierto (lo que resuelve mi problema) o tengo que abrirlo explícitamente en el primer proceso con algún tipo de indicador o argumento?
Para aclarar:
Tengo una aplicación Java que enumera una carpeta y abre cada archivo en la lista para procesarlo. Procesa cada archivo tras otro. El procesamiento de cada archivo consiste en leerlo y hacer algunos cálculos en función del contenido y tarda unos 2 minutos. También tengo otra aplicación Java que hace lo mismo pero escribe en el archivo. Lo que quiero es poder ejecutar estas aplicaciones al mismo tiempo, por lo que el escenario es el siguiente. ReadApp enumera la carpeta y busca los archivos A, B, C. Abre el archivo A e inicia la lectura. WriteApp enumera la carpeta y busca los archivos A, B, C. Abre el archivo A, ve que está abierto (por una excepción o de cualquier manera) y va al archivo B. ReadApp finaliza el archivo A y continúa con B. Ve que está abierto y continúa a C. Es fundamental que WriteApp no escriba mientras ReadApp esté leyendo el mismo archivo o viceversa. Son procesos diferentes.
FileChannel.lock es probablemente lo que quieres.
try (
FileInputStream in = new FileInputStream(file);
java.nio.channels.FileLock lock = in.getChannel().lock();
Reader reader = new InputStreamReader(in, charset)
) {
...
}
(Descargo de responsabilidad: código no compilado y ciertamente no probado).
Tenga en cuenta la sección titulada "dependencias de plataforma" en el documento API de FileLock .
Si puedes usar Java NIO ( JDK 1.4 o superior ), entonces creo que estás buscandojava.nio.channels.FileChannel.lock()
CanalDeArchivo.lock()
utilice java.nio.channels.FileLock junto con java.nio.channels.FileChannel
Puede que esto no sea lo que estás buscando, pero con el interés de abordar un problema desde otro ángulo...
¿Son estos dos procesos Java los que podrían querer acceder al mismo archivo en la misma aplicación? ¿Quizás pueda filtrar todo el acceso al archivo a través de un único método sincronizado (o, mejor aún, usando JSR-166 )? De esa manera, puede controlar el acceso al archivo y quizás incluso poner en cola las solicitudes de acceso.