Question

J'essaie donc verrouillé le fichier pour le lire, mais je suis IOException, toute idée pourquoi?

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

et je IOException: The process cannot access the file because another process has locked a portion of the file eu cette erreur

Était-ce utile?

La solution

pourrait tout aussi bien ajouter cela comme une réponse au lieu d'un commentaire.

Si vous utilisez l'API FileLock vous devez utiliser les APIs de fichiers NIO correspondants.

Autres conseils

Reproduire ma réponse ici (dans le cas où il est supprimé) , et en ajoutant les commentaires de Jeff Foster:

Considérant qu'une instance de l'exception OverlappingFileLockException est levée, il apparaît qu'un autre thread dans le même processus tente de verrouiller sur le même fichier. Ce n'est pas un conflit entre A et B, mais plutôt un conflit à l'intérieur B, si l'on va par la documentation de l'API sur la méthode de verrouillage () et lorsque la condition dans laquelle il jette OverlappingFileLockException:

Si un verrou qui chevauche la demande région est déjà détenue par ce Java machine virtuelle, ou si un autre thread est déjà bloqué dans cette méthode et tente de verrouiller un chevauchement région du même fichier

La seule solution pour éviter ce problème, est d'avoir tout autre fil à B empêché d'acquérir un verrou sur le même fichier, ou la même région de chevauchement dans le fichier.

Le IOException être jeté a un peu un message plus intéressant. Elle confirme sans doute la théorie ci-dessus, mais sans regarder l'intégralité du code source, je ne peux pas confirmer quoi que ce soit. La méthode lock devrait bloquer jusqu'à ce que le verrou exclusif est acquis. Si elle a été acquise, alors il devrait y avoir aucun problème à la lecture du fichier. Sauf pour une condition. Si le fichier a déjà été ouvert (et verrouillé) par la même machine virtuelle Java dans un thread différent, en utilisant un objet de fichier (ou en d'autres termes, un second / autre descripteur de fichier), puis la tentative de lire le premier descripteur de fichier échouera même si le verrou a été acquis (après tout, la serrure ne se verrouille pas les autres threads).

Une conception améliorée, serait d'avoir un seul fil dans chaque processus qui acquiert un verrou exclusif sur le fichier (en utilisant un seul objet de fichier, ou un seul descripteur de fichier) pour seulement un certain laps de temps, effectuer l'activité nécessaire dans la fichier, puis relâchez le verrou.

Comme Jeff l'a souligné, en utilisant les API NIO entraînerait probablement dans la résolution du problème. Ceci est entièrement dû à la possibilité de l'API FileReader l'ouverture d'un nouveau descripteur de fichier , qui est différent de celui que le verrou est obtenu sur.

Peut-être ce que vous voulez est quelque chose comme:

FileInputStream fis = new FileInputStream(file);
channel = fis.getChannel();
channel.lock();
bufferedReader = new BufferedReader(new InputStreamReader(fis));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top