¿Cómo puedo bloquear un archivo usando Java (si es posible)?

Resuelto Paralife asked hace 15 años • 8 respuestas

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.

Paralife avatar Sep 24 '08 22:09 Paralife
Aceptado

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 .

Tom Hawtin - tackline avatar Sep 24 '2008 16:09 Tom Hawtin - tackline

Si puedes usar Java NIO ( JDK 1.4 o superior ), entonces creo que estás buscandojava.nio.channels.FileChannel.lock()

CanalDeArchivo.lock()

KC Baltz avatar Sep 24 '2008 16:09 KC Baltz

utilice java.nio.channels.FileLock junto con java.nio.channels.FileChannel

Matt avatar Sep 24 '2008 16:09 Matt

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.

pkaeding avatar Sep 25 '2008 03:09 pkaeding