Pregunta

Así que trato de bloquear el archivo para leerlo, pero obtuve IoException, ¿alguna idea de por qué?

public static void main(String[] args){
    File file = new File("C:\\dev\\harry\\data.txt");

    FileReader fileReader = null;
    BufferedReader bufferedReader = null;
    FileChannel channel = null;
    FileLock lock = null;
    try{
        channel  = new RandomAccessFile(file, "rw").getChannel();
        lock = channel.lock();
        fileReader = new FileReader(file);
        bufferedReader = new BufferedReader(fileReader);
        String data;
        while((data = bufferedReader.readLine()) != null){
            System.out.println(data);
        }
    }catch(IOException e){
        e.printStackTrace();
    }finally{
        try {
            lock.release();
            channel.close();
            if(bufferedReader != null) bufferedReader.close();
            if(fileReader != null) fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Y recibí este error IOException: The process cannot access the file because another process has locked a portion of the file

¿Fue útil?

Solución

También podría agregar esto como una respuesta en lugar de un comentario.

Si usa el FileLock API necesita usar las API del archivo NIO correspondientes.

Otros consejos

Reproduciendo mi respuesta de aquí (en caso de que se elimine), y agregar los comentarios de Jeff Foster:

Considerando que una instancia del OverlappingFileLockException Se lanza una excepción, parece que otro hilo en el mismo proceso intenta bloquear en el mismo archivo. Este no es un conflicto entre A y B, sino un conflicto dentro de B, si uno pasa por la documentación de la API en el método Lock () y cuando la condición bajo la cual arroja superpuesta de FilelockException:

Si un bloqueo que se superpone a la región solicitada ya está sostenida por esta máquina virtual Java, o si otro hilo ya está bloqueado en este método e intenta bloquear una región superpuesta del mismo archivo

La única solución para evitar esto es que cualquier otro hilo en B impida adquirir un bloqueo en el mismo archivo, o la misma región superpuesta en el archivo.

los IOException Ser lanzado tiene un mensaje un poco más interesante. Probablemente confirme la teoría anterior, pero sin mirar todo el código fuente, no puedo confirmar nada. los lock Se espera que el método bloquee hasta que se adquiere el bloqueo exclusivo. Si se adquirió, entonces no debería haber ningún problema en la lectura del archivo. Excepto por una condición. Si el archivo ya ha sido abierto (y bloqueado) por el mismo JVM en un hilo diferente, usando un objeto de archivo (o en otras palabras, un segundo/diferente descriptor de archivo), entonces el intento de lectura en el primer descriptor de archivo fallará incluso Si se adquirió el bloqueo (después de todo, el bloqueo no bloquea otros hilos).

Un diseño mejorado, sería tener un solo hilo en cada proceso que adquiera un bloqueo exclusivo en el archivo (mientras usa un solo objeto de archivo, o un solo descriptor de archivo) por solo una cierta cantidad de tiempo, realice la actividad requerida en el archivo y luego suelte el bloqueo.

Como Jeff ha señalado, usar las API de NIO probablemente daría como resultado la resolución del problema. Esto se debe completamente a la Posibilidad de la API de FileReader que abre un nuevo descriptor de archivo, que es diferente de la que se obtiene el bloqueo.

Quizás lo que quieres es algo más como:

FileInputStream fis = new FileInputStream(file);
channel = fis.getChannel();
channel.lock();
bufferedReader = new BufferedReader(new InputStreamReader(fis));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top