Dateizugriff Sperren

wakoz

Erfahrenes Mitglied
Moinsen,

ich würde gerne ein paar Threads auf einen ordner los lassen und dort files auslesen, nur ist es blöde wenn jeder Thread die selbe datei einliest.
Ich dachte mir so was wie File lock oder so aber leider bekomme ich das nicht hin :(

Code:
java.nio.channels.NonWritableChannelException
	at sun.nio.ch.FileChannelImpl.lock(FileChannelImpl.java:773)
bekomme ich wenn ich beim channel.look
Code:
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
      
        fileInputStream = new FileInputStream(file);
      
        FileChannel channel = fileInputStream.getChannel();
        lock = channel.lock(0,Long.MAX_VALUE,false);
bei dieser variante, wenn ich lock(0,Long.MAX_VALUE,true) mache wird die datei nicht gesperrt und alle threads können lesen :(

ich stehe gerade auf dem schlauch, oder muss ich den xml reader weiter laden bis ich locken darf/kann?

ich möchte aber auf keinen fall schreiben, oder so!
Die Threads sollen alle nur Lesen wobei die Thread steuerung selber vom lesen nichts weiß und wissen soll, für die threads ist das nur ne methode die durchlaufen wird und ein return value hat.

help ;)
 
Da hast du gleich einen dicken Fehler :
du holst dir einen Channel von einem InputStream ... folglich öffnet Java das File im read-only-Modus ... und genau das ist es wesshalb du keinen FileLock setzen kannst ... denn dafür brauchst du den read-write-Modus.
Auch ist die Art und Weise wie du dir den FileLock holst nicht gerade sauber ...
Versuch doch mal das hier :

! ACHTUNG ! Java 7 ! Der folgende Code ist für Java 7 geschrieben ...

Java:
File file=new File("/absoluter/Pfad/zur/Datei.ext"); // java.io.File - Objekt für Datei erzeugen
Path path=file.toPath(); // java.nio.file.Path - Objekt erzeugen
FileChannel fileChannel=FileChannel.open(path, StandardOpenOption.valueOf("WRITE")); // java.nio.channels.FileChannel - Objekt über Instanz-Methode erzeugen
FileLock fileLock=fileChannel.tryLock(); // FileLock über das gesamte File versuchen - vorteil : tryLock() blockiert nicht und returned immer ohne Exception
if(fileLock==null) // prüfen ob FileLock erfolgreich erstellt werden konnte - wenn NULL : File bereits gelockt
	// TO-DO : Info : File bereits gelockt

Wie gesagt : diese Variante benötigt unbedingt Java 7 da sie auf das neue Paket java.nio.file zugreift ...
Eine Lösung für Java 6 dürfte ich aber auch noch irgendwo haben.
 
Das ist ja doof, ich will die Datei lesen und kann den zugriff nicht beschränken weil ich nur lesen will :/

Also wenn ich nur die Zeichen (Bites) so lesen würde, dann könnte ich den Randomaccessfile nehmen ;) aber mit einem XML Stream den ich daraus machen möchte geht das leider nicht.

naja danke

PS ich habe sensüchtig auf Java 7 gewartet, aber nun schaffe ich nicht (zeitlich) es zu installieren und zu nutzen :(
 
Zuletzt bearbeitet:
Zurück