Ich muss ein Java-Programm erstellen, das einen Thread erstellt, um nach einer Datei in einem bestimmten Ordner (Quellordner) zu suchen, und die Datei sofort für die Prozessarbeit auswählen (in das CSV-Dateiformat konvertieren), sobald sie die Datei in der Quelle gefunden hat Mappe. Problem, dem ich jetzt gegenüberstehe, ist die Datei, die zum Quellordner kommt, hat eine große Größe (FTP-Tool wird verwendet, um Datei vom Server zum Quellordner zu kopieren), Thread wählt diese Datei sofort aus, bevor sie vollständig in Quellordner kopiert und Ausnahme auslöst. Wie halte ich den Thread an, bis die Datei vollständig in den Quellordner kopiert wurde ?. Sie muss die Datei erst zur Verarbeitung auswählen, nachdem die Datei vollständig in den Quellordner kopiert wurde.
Am sichersten ist es, die Datei an einen anderen Ort herunterzuladen und dann in den Zielordner zu verschieben.
Eine weitere von Bombe erwähnte Variante besteht darin, den Dateinamen nach dem Herunterladen in eine andere Erweiterung zu ändern und nur nach Dateien mit dieser Erweiterung zu suchen.
Ich lese nur die Datei, die nicht im Schreibmodus ist. Dies ist am sichersten, da dies bedeutet, dass kein anderer Prozess in diese Datei schreibt. Sie können überprüfen, ob sich die Datei nicht im Schreibmodus befindet, indem Sie die canWrite-Methode der File-Klasse verwenden.
Diese Lösung funktioniert gut für mich, da ich genau das gleiche Szenario habe, mit dem Sie konfrontiert sind.
Du könntest verschiedene Dinge ausprobieren:
Wenn Sie etwas Kontrolle über den FTP-Prozess haben, können Sie möglicherweise sofort eine "Flag-Datei" im Quellverzeichnis erstellen, NACHDEM der ftp für die große Datei beendet ist.
Dann muss Ihr Java-Thread das Vorhandensein dieser Flag-Datei prüfen, wenn es vorhanden ist, dann gibt es eine Datei, die bereit ist, im Quellverzeichnis verarbeitet zu werden. Bevor die große Datei verarbeitet wird, sollte der Thread die Flag-Datei entfernen.
Flag-Datei kann alles sein (auch eine leere Datei).
Angenommen, Sie haben keine Kontrolle über den FTP-Prozess ...
Lass es so sein. Wenn Sie die Ausnahme erhalten, versuchen Sie, sie beim nächsten Mal erneut zu verarbeiten. Wiederholen Sie dies, bis die Datei verarbeitet wurde. Es ist gut, einige Attribute im Ausnahmefall zu behalten, um sie später zu überprüfen, z. Name, zuletzt geändert, Größe.
Überprüfen Sie die genaue Ausnahme, bevor Sie entscheiden, sie später zu verarbeiten. Die Ausnahme kann aus einem anderen Grund auftreten.
Das ist in Grails und ich benutze FileUtils
Library aus dem Apache commons fame. Die Funktion sizeof
gibt die Größe in Bytes zurück.
Bitte beachten Sie, dass dies auch davon abhängt, welches Dienstprogramm oder Betriebssystem Sie zum Übertragen der Dateien verwenden. Am sichersten ist es, die Datei zu kopieren, die kopiert oder in eine andere Datei oder ein anderes Verzeichnis kopiert wurde. Der Kopiervorgang ist robust und gewährleistet, dass die Datei nach dem Kopiervorgang vorhanden ist. Der, den ich benutze, stammt von der Commons API.
FileUtils.copyFileToDirectory (Datei f, Verzeichnis D)
Wenn Sie eine große Datei kopieren, die gerade kopiert wird, beachten Sie bitte, dass dies einige Zeit in Anspruch nehmen wird. Sie können dies auch im parallelen Thread starten oder eine separate Anwendung für den Übertragungsprozess verwenden.
Tags und Links java multithreading file-io ftp