{"id":2278,"date":"2013-09-09T16:17:18","date_gmt":"2013-09-09T14:17:18","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2278"},"modified":"2013-09-09T16:17:18","modified_gmt":"2013-09-09T14:17:18","slug":"mit-locking-dateien-sperren","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/09\/mit-locking-dateien-sperren\/","title":{"rendered":"Mit Locking Dateien sperren"},"content":{"rendered":"<p>Damit eine Datei gegen konkurrierenden parallelen Zugriff gesch\u00fctzt ist, l\u00e4sst sie sich \u00fcber Locking absichern. Um einen Lock f\u00fcr Dateien zu erwerben bietet die Java-API ein FileLock-Objekt. So ein FileLock bekommt ein Programm von der Methode lock() eines FileChannels \u2013 ein FileChannel wiederum kommt von getChannel(), einer Methode, die FileInputStream, FileOutputStream oder RandomAccessFile anbieten.<\/p>\n<p>Beispiel: \u00d6ffne eine Datei, erzeuge exklusiven Zugriff, und schreibe Daten:<\/p>\n<p>FileOutputStream fos = new FileOutputStream( file );<\/p>\n<p>try ( FileLock fileLock = fos.getChannel().tryLock() ) {<\/p>\n<p>&#160; fos.write( \u2026 );<\/p>\n<p>}<\/p>\n<p>Hinweis: Die \u00fcbliche Schreibweise OutputStream fos funktioniert nat\u00fcrlich nicht, da ein allgemeiner OutputStream keine getChannel()-Methode bietet.<\/p>\n<p>Die lock(\u2026)-Methode liefert als Ergebnis ein FileLock-Objekt. Das wiederum bietet einige Methoden, wobei f\u00fcr uns nur release() bzw. close() interessant sind, die den Lock wieder freigeben. FileLock implementiert die Schnittstelle AutoCloseable, sodass ein FileLock auch auch try-mit-Ressourcen verwendet werden kann, wie im Beispiel geschehen.<\/p>\n<p>Um zu testen, ob eine gegebene Datei gelockt ist, l\u00e4sst sich tryLock() verwenden \u2013 etwa mit der folgenden statischen Hilfsmethode:<\/p>\n<p>public static boolean isLocked( String filename ) {<\/p>\n<p>&#160; try ( RandomAccessFile raf = new RandomAccessFile( filename, &quot;rw&quot; ); FileLock lock = raf.getChannel().tryLock() ) {<\/p>\n<p>&#160;&#160;&#160; \/\/ Nothing to do here<\/p>\n<p>&#160; }<\/p>\n<p>&#160; catch ( IOException e ) {<\/p>\n<p>&#160;&#160;&#160; return false;<\/p>\n<p>&#160; }<\/p>\n<p>&#160; return true;<\/p>\n<p>}<\/p>\n<p>Die Methoden tryLock(\u2026) und lock(\u2026) liefern FileLock-Objekt und diese Ressource muss immer korrekt geschlossen werden.<\/p>\n<p>Hinweis: Unter Unix-Systemen gibt es kein eindeutig vorgeschriebenes Verfahren zum File-Locking[1], sodass Oracle das Sperren bisher nur so umsetzt, dass zwei Java-Programme sich gegenseitig nicht in die Quere kommen, es aber sein kann, dass ein anderes Unix-Programm diesen Lock nicht respektiert. So kann unter Unix eine Datei von mehreren Seiten gelesen werden, selbst wenn ein Java-Programm sie aktuell beschreibt. Auch kann eine Datei auf dem Dateisystem gel\u00f6scht werden, selbst wenn das Java-Programm sie noch offen h\u00e4lt. Das Windows-Betriebssystem unterst\u00fctzt hingegen Locks. Wenn ein Prozess keinen Lock auf die Datei besitzt, kann der Prozess die Datei auch nicht lesen.<\/p>\n<hr size=\"1\" width=\"33%\" \/>\n<p>[1] Zum Beispiel mit dem Allesk\u00f6nner fcntl() aus dem POSIX-Standard oder flock() von 4.2 BSD.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Damit eine Datei gegen konkurrierenden parallelen Zugriff gesch\u00fctzt ist, l\u00e4sst sie sich \u00fcber Locking absichern. Um einen Lock f\u00fcr Dateien zu erwerben bietet die Java-API ein FileLock-Objekt. So ein FileLock bekommt ein Programm von der Methode lock() eines FileChannels \u2013 ein FileChannel wiederum kommt von getChannel(), einer Methode, die FileInputStream, FileOutputStream oder RandomAccessFile anbieten. Beispiel: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-2278","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2278","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2278"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2278\/revisions"}],"predecessor-version":[{"id":2279,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2278\/revisions\/2279"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2278"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2278"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}