Frage

Ich habe eine Java-Anwendung, die einen Ordner für eingehende XML-Dateien überwacht. Wenn eine neue Datei gefunden wird Ich brauche die Datei zu testen, dass es nicht zur Zeit aktualisiert wird und geschlossen ist. Mein Gedanke ist, Datei zu verwenden. CanWrite () dies zu testen. Gibt es eine Ausgabe mit diesem? Ist das eine gute Möglichkeit zu testen, dass eine Datei vollständig geschrieben wurde?

Andere Ideen, die ich warf mich um, sind:

  • Analysieren Sie die eingehende XML-Datei und Test dass der End-Tag ist da.
  • Überprüfen Sie die EOF-Zeichen.

Ich bin nur nicht sicher, dass eine dieser Methoden werden alle Szenarien behandeln.

War es hilfreich?

Lösung

Nein, CanWrite für diesen Zweck nicht geeignet. Im Allgemeinen wird die Datei beschreibbar sein, auch wenn ein anderer Prozess schreibt.

Sie benötigen ein höheres Protokoll die Verriegelung zu koordinieren. Wenn Sie diesen Code zu verwenden, um auf einer einzigen Plattform zu planen, können Sie in der Lage sein, ein href zu verwenden <= "http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileLock .html“rel = "noreferrer"> FileLock Anlage der NIO. Aber die Dokumentation sorgfältig lesen und beachten Sie, dass auf vielen Plattformen, die Sperre ist nur beratenden Charakter haben.

Ein weiterer Ansatz ist ein Prozess die Datei zu haben, mit einem Namen schreiben, dass Ihr Prozess nicht erkannt wird, dann die Datei in einen erkennbaren Namen umbenennen, wenn der Schreibvorgang abgeschlossen ist. Auf den meisten Plattformen ist der Umbenennungsvorgang atomar, wenn die Quelle und das Ziel das gleiche Dateisystem Volumen sind. Die Namensänderung eine andere Dateierweiterung verwenden können, oder auch die Datei von einem Verzeichnis in ein anderes bewegen (auf dem gleichen Volumen).

Da in diesem Fall, dass Sie ausschließlich mit XML arbeiten, sucht einen engen Tag funktionieren würde, aber es ist nicht narrensicher-was, wenn es Kommentare nach dem letzten Markup ist, oder der Schriftsteller oder einfach nicht gültigen XML schreibt ?

Suche nach dem EOF wird nicht Arbeit. Es wird immer ein EOF sein, auch wenn der Autor hat gerade die Datei geöffnet und hat noch nichts geschrieben. Wenn dies nicht so wäre, wäre die einfachste Sache, dem Leser zu ermöglichen, sobald die Datei zeigte bis zu starten Parsen; es wäre einfach zu blockieren, bis der Schreiber die Datei geschlossen. Aber das Dateisystem nicht auf diese Weise arbeiten. Jede Datei hat ein Ende, auch wenn einige Verfahren zur Zeit es sich bewegt.

Andere Tipps

Wenn Sie darüber hinaus durch einen Schreib gefolgt einen Scheck zu tun, dann haben Sie eine Race-Bedingung. Der Staat könnte zwischen dem Scheck und dem Schreib ändern. Manchmal ist es am besten, um zu versuchen und tun das, was Sie wollen und Fehler ordnungsgemäß handhaben. vielleicht ein n-Versuch Wiederholungsmechanismus mit einer erhöhten Rückfallverzögerungszeit.

oder Ihren Test neu zu definieren. In diesem Fall könnten Sie vielleicht testen, ob die Dateigröße nicht über einen Zeitraum von Zeit, die vor der Verarbeitung verändert hat.

Eine andere Möglichkeit ist, den Code in zwei Teile zu spalten, Sie einen anderen Thread haben könnte - vielleicht ein Quarz Aufgabe -. Verantwortlich für die fertigen Dateien in ein anderes Verzeichnis, das Ihre Hauptcode Prozesse bewegen

Eine Sache, die in Windows zu arbeiten scheint, ist dies - Erstellen Sie eine Datei () Objekt, das die betreffende Datei darstellt (mit Konstruktor mit vollständigen Dateinamen) Erstellen Sie ein zweites identisches Datei-Objekt, gleiche Art und Weise -. - Versuchen Sie firstFile.renameTo (secondFile)

Diese Dummy-Übung Umbenennung scheint mit Dateien erfolgreich zu sein, die für die Bearbeitung durch einen anderen App nicht geöffnet sind (ich mit Word getestet), aber nicht, wenn sie offen sind.

Und als nw filename = der alte Dateiname es schafft keine andere Arbeit.

Soweit ich weiß, gibt es keine Möglichkeit zu sagen, wenn ein anderer Prozess zur Zeit ein offenes Handle auf eine Datei von Java hat. Eine Möglichkeit ist die FileLock Klasse von neuen io. Dies ist nicht auf allen Plattformen unterstützt, aber wenn die Dateien lokal sind und der Prozess die Datei zu schreiben kooperiert, soll diese Arbeit für jede Plattform, Schlösser zu unterstützen.

Wenn Sie sowohl die Leser und Schreiber steuern, dann eine potentielle Verriegelungstechnik wäre eine Sperre erstellen Verzeichnis - das ist in der Regel eine atomare Operation - für die Lese- und Schreibprozessdauer. Wenn Sie diese Art von Ansatz, haben Sie den möglichen Ausfall eines Prozess verwalten in einer „hängenden“ Arretierverzeichnis führt.

Als Cheekysoft erwähnt, Dateien sind nicht atomar und sind schlecht geeignet für die Verriegelung.

Wenn Sie nicht über den Schriftsteller steuern - zum Beispiel, wenn sie von einem FTP-Daemon produziert werden werden - dann ist die Umbenennungs Technik oder Verzögerung für Zeitspanne Technik sind die besten Optionen

.
scroll top