Domanda

Quindi provo a bloccare il file per leggerlo, ma ho ottenuto Ioexception, qualche idea perché?

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();
        }
    }
}

E ho ricevuto questo errore IOException: The process cannot access the file because another process has locked a portion of the file

È stato utile?

Soluzione

Potrebbe anche aggiungere questo come risposta invece di un commento.

Se usi il FileLock API È necessario utilizzare le API del file NIO corrispondenti.

Altri suggerimenti

Riproducendo la mia risposta da Qui (nel caso in cui venga eliminato), e aggiungendo il feedback di Jeff Foster:

Considerando che un'istanza del OverlappingFileLockException Viene lanciata un'eccezione, sembra che un altro thread nello stesso processo stia tentando di bloccare lo stesso file. Questo non è un conflitto tra A e B, ma piuttosto un conflitto all'interno di B, se si passa alla documentazione API sul metodo Lock () e quando la condizione in cui lancia sovrappostiflelockexception:

Se un blocco che si sovrappone alla regione richiesta è già detenuto da questa macchina virtuale Java o se un altro thread è già bloccato in questo metodo e sta tentando di bloccare una regione sovrapposta dello stesso file

L'unica soluzione per impedire questo è avere qualsiasi altro thread in B impedendo ad acquisire un blocco sullo stesso file o la stessa regione sovrapposta nel file.

Il IOException Essere lanciati ha un messaggio un po 'più interessante. Probabilmente conferma la teoria di cui sopra, ma senza guardare l'intero codice di origine, non posso confermare nulla. Il lock Il metodo dovrebbe bloccare fino a quando non viene acquisito il blocco esclusivo. Se è stato acquisito, allora non dovrebbe esserci alcun problema nella lettura dal file. Tranne una condizione. Se il file è già stato aperto (e bloccato) dallo stesso JVM in un thread diverso, utilizzando un oggetto file (o in altre parole, un secondo/diverso descrittore di file), quindi il tentato letto sul primo descrittore del file fallirà anche Se il blocco è stato acquisito (dopo tutto, il blocco non blocca altri thread).

Un design migliorato, sarebbe quello di avere un singolo thread in ciascun processo che acquisisce un blocco esclusivo sul file (mentre si utilizza un singolo oggetto file o un singolo descrittore di file) per un certo periodo di tempo, eseguire l'attività richiesta in File e quindi rilasciare il blocco.

Come ha sottolineato Jeff, l'uso delle API NIO comporterebbe probabilmente una risoluzione del problema. Questo è interamente dovuto al Possibilità che l'API FileReader apra un nuovo descrittore di file, che è diverso da quello su cui si ottiene il blocco.

Forse quello che vuoi è qualcosa di più simile:

FileInputStream fis = new FileInputStream(file);
channel = fis.getChannel();
channel.lock();
bufferedReader = new BufferedReader(new InputStreamReader(fis));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top