Frage

Also versuche ich, die Datei zu sperren, um sie zu lesen, aber ich habe ioException, irgendeine Idee warum?

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

Und ich habe diesen Fehler bekommen IOException: The process cannot access the file because another process has locked a portion of the file

War es hilfreich?

Lösung

Könnte dies auch als Antwort anstelle eines Kommentars hinzufügen.

Wenn Sie die verwenden FileLock API Sie müssen die entsprechende NIO -Datei -APIs verwenden.

Andere Tipps

Reproduzieren meine Antwort von Hier (falls es gelöscht wird), und Hinzufügen von Jeff Fosters Feedback:

In Anbetracht dessen eine Instanz der OverlappingFileLockException Ausnahme wird ausgelöst, es scheint, dass ein anderer Thread im selben Prozess versucht, dieselbe Datei zu sperren. Dies ist kein Konflikt zwischen A und B, sondern ein Konflikt innerhalb von B.

Wenn eine Sperre, die sich über die angeforderte Region überlappt

Die einzige Lösung, um dies zu verhindern, besteht darin, einen anderen Thread in B daran zu hindern, eine Sperre für dieselbe Datei oder denselben überlappenden Bereich in der Datei zu erwerben.

Das IOException geworfen zu werden hat etwas interessantere Nachricht. Es bestätigt wahrscheinlich die obige Theorie, aber ohne den gesamten Quellcode zu betrachten, kann ich nichts bestätigen. Das lock Die Methode wird erwartet, bis das exklusive Schloss erworben wird. Wenn es erworben wurde, sollte es kein Problem beim Lesen der Datei geben. Außer einer Bedingung. Wenn die Datei bereits von demselben JVM in einem anderen Thread geöffnet (und gesperrt) wurde, unter Verwendung eines Dateiobjekts (oder mit anderen Worten, einen Sekunde/unterschiedlichen Dateideskriptor), wird der Versuch, im ersten Dateideskriptor zu lesen Wenn das Schloss erworben wurde (schließlich sperrt das Schloss andere Fäden nicht).

Ein verbessertes Design, wäre, einen einzelnen Thread in jedem Prozess zu haben, der eine exklusive Sperre in der Datei (während der Verwendung eines einzelnen Dateiobjekts oder eines einzelnen Dateideskriptors) für nur eine bestimmte Zeitspanne die erforderliche Aktivität in der Datei und dann das Schloss freigeben.

Wie Jeff betont hat, würde die Verwendung der NIO -APIs wahrscheinlich zu einer Lösung des Problems führen. Dies liegt ausschließlich auf die Möglichkeit der Öffnung der FileReader -API, die einen neuen Dateideskriptor eröffnet, was sich von dem unterscheidet, auf dem das Schloss erhalten wird.

Vielleicht ist das, was Sie wollen, etwas mehr wie:

FileInputStream fis = new FileInputStream(file);
channel = fis.getChannel();
channel.lock();
bufferedReader = new BufferedReader(new InputStreamReader(fis));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top