Wie kann eine Datei in Java automatisch umbenannt werden, selbst wenn die Zieldatei bereits existiert?
Habe ich ein cluster von Maschinen, die jeweils über eine Java-app.
Diese Java-apps benötigen Zugriff auf ein einzigartiges resource.txt
Datei concurently.
Ich muss atomar umbenennen temp.txt
Datei zu resource.txt
in Java, auch wenn resource.txt
bereits vorhanden.
Löschen resource.txt
und umbenennen temp.txt
funktioniert nicht, es ist nicht atomar (es entsteht ein kleiner Zeitrahmen, wo resource.txt
existiert nicht).
Sein und es sollte cross-Plattform...
Dank !
Kommentar zu dem Problem
Note to self, 8 Jahre später: ich erinnere mich nicht den Zusammenhang, aber wenn die problem erfordert eine cross-Plattform-Atomarität, vielleicht die Lösung sollte nicht mit einer Datei?
InformationsquelleAutor der Frage Sébastien RoccaSerra | 2009-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Java 1.7+, verwenden Sie
java.nio.file.Files.move(Path source, Path target, CopyOption... options)
mit CopyOptions "REPLACE_EXISTING" und "ATOMIC_MOVE".Siehe API-Dokumentation für weitere Informationen.
Beispiel:
InformationsquelleAutor der Antwort Eirik W
Unter Linux (und ich glaube, Solaris und andere UNIX-Betriebssysteme), der Java-Datei.renameTo () - Methode überschreibt die Ziel-Datei, wenn es vorhanden ist, aber dies ist nicht der Fall unter Windows.
Cross-Plattform, ich denke, man müsste mit file locking auf resource.txt und dann werden die Daten überschrieben.
Linux verwendet standardmäßig die freiwillige sperren, während Windows erzwingt es. Vielleicht könnten Sie erkennen, das OS, und verwenden Sie renameTo() unter UNIX mit einigen sperren code für Windows?
Da ist auch ein Weg, um wiederum auf obligatorische locking unter Linux für bestimmte Dateien, aber es ist irgendwie obskur. Sie haben zu stellen Sie das Modus-bits gerade Recht.
InformationsquelleAutor der Antwort Stephen Pape
Hier ist eine Diskussion, die sich: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4017593
InformationsquelleAutor der Antwort TofuBeer
Wie gesagt hier, es sieht aus wie das Windows OS gar nicht unterstützt atomic-Datei umbenennen für die älteren Versionen. Es ist sehr wahrscheinlich müssen Sie einige manuelle locking-Mechanismen oder eine Art von Transaktionen. Für, die, möchten Sie vielleicht einen Blick in die apache-commons-Transaktion Paket.
InformationsquelleAutor der Antwort MicSim
Sollte cross-Plattform schlage ich 2 Möglichkeiten:
InformationsquelleAutor der Antwort bruno conde
Wenn das Ziel der Umbenennung ist zu ersetzen resource.txt on-the-fly und Sie haben die Kontrolle über alle Programme beteiligt, und die Häufigkeit der Ersatz ist nicht hoch, können Sie das folgende tun.
Öffnen/Lesen der Datei:
Um die Datei zu ersetzen:
Die sicherstellen, dass alle Ihre Leser finden immer eine gültige Datei.
Aber einfacher wäre es, einfach zu versuchen, Ihre öffnung in einer Schleife, wie:
InformationsquelleAutor der Antwort Lawrence Dol
Erhalten Sie möglicherweise einige Traktion durch die Schaffung einer filechannel Sperre auf die Datei vor dem umbenennen und dem löschen der Datei, die Sie gehen zu überschreiben, sobald Sie die Sperre).
-r
InformationsquelleAutor der Antwort rogerdpack