Ich muss "tail -f" mit Java nachahmen können. Ich versuche, eine Protokolldatei zu lesen, da sie von einem anderen Prozess geschrieben wird. Wenn ich die Datei zum Lesen öffne, wird die Datei jedoch gesperrt und der andere Prozess kann nicht mehr darauf schreiben. Jede Hilfe würde sehr geschätzt werden!
Hier ist der Code, den ich momentan verwende:
%Vor% Der Aufbau des Tails ist aufgrund einiger spezieller Fälle wie Dateikürzung und (mittleres) Löschen schwierig. Um die Datei ohne Sperre zu öffnen, verwenden Sie StandardOpenOption.READ
wie folgt mit der neuen Java-Datei-API:
Für meinen Versuch, einen Tail in Java zu erstellen, siehe:
examineFile(…)
in Ссылка
queue.feed(lineContent)
übergibt den Zeileninhalt für die Verarbeitung durch Listener und entspricht Ihrem this.parse(…)
. Lassen Sie sich von diesem Code inspirieren oder kopieren Sie einfach die Teile, die Sie benötigen. Lassen Sie es mich wissen, wenn Sie Probleme finden, die mir nicht bekannt sind.
Windows verwendet obligatorische Sperren für Dateien, es sei denn, Sie geben beim Öffnen die richtigen Freigabeflags an. Wenn Sie eine ausgelastete Datei öffnen möchten, müssen Sie Win32-API CreateFile
ein Handle mit den Freigabeflaggen FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE
.
Dies wird innerhalb des JDK an einigen Stellen verwendet, um Dateien zum Lesen von Attributen und Dingen zu öffnen, aber soweit ich sehen kann, ist es nicht exportiert / verfügbar für Java-Klassenbibliothek. Sie müssten also eine native Bibliothek dafür finden.
Ich denke, als schnelle Lösung können Sie process.getInputStream()
vom Befehl "cmd /D/C type file.lck"
Wenn Sie eine schnelle Lösung wünschen, die nicht unbedingt die eleganteste ist, überwachen Sie die Datei einfach auf Größenänderungen, öffnen Sie dann die Datei, suchen Sie die letzte Position, lesen Sie die neuen Daten, schließen Sie die Datei und überwachen Sie weiter.
Und wenn Leistung keine Rolle spielt, sollte das gut funktionieren. Wenn Sie jedoch Leistung benötigen, sollten Sie eine komplexere Lösung bevorzugen, die auf einer fortgeschrittenen Datei-IO-API basiert.