Wie geht man mit unvollständigen Dateien um? Ausnahme erhalten

8

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.

    
raja 04.02.2009, 06:26
quelle

7 Antworten

4

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.

    
qbeuek 04.02.2009 06:48
quelle
4

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.

    
Bhushan Bhangale 04.02.2009 07:56
quelle
3

Du könntest verschiedene Dinge ausprobieren:

  • Wiederhole das Datum der letzten Änderung und die Größe der Datei, bis sie sich für eine bestimmte Zeit nicht mehr ändert, und verarbeite sie dann. (Laut qbeiek ist dies weder sicher noch deterministisch. )
  • Verarbeitet nur Dateien mit Namen, die bestimmten Kriterien entsprechen (z. B. * .dat). Ändern Sie den FTP-Upload- / Download-Prozess, um Dateien mit einem anderen Namen (z. B. * .dat.temp) hochzuladen / herunterzuladen, und benennen Sie die Dateien nach ihrer Fertigstellung um.
  • Laden Sie die Dateien an einen anderen Ort herunter und verschieben Sie sie nach Abschluss in Ihr Verarbeitungsverzeichnis.
  • Wie Essig sagte, wenn es beim ersten Mal nicht funktioniert, versuchen Sie es später noch einmal. :)
Bombe 04.02.2009 06:42
quelle
2

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).

    
jfpoilpret 04.02.2009 06:41
quelle
1

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.

    
Adeel Ansari 04.02.2009 06:33
quelle
0

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.

%Vor%

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.

    
user1313900 08.10.2012 19:52
quelle
0

Wenn Ihr Betriebssystem Linux ist und Ihr Kernel & gt; 2.6.13, könnten Sie die Dateisystem-Ereignisbenachrichtigungs-API namens inotify verwenden. Es gibt eine Java-Implementierung hier: Ссылка .

Hier ist ein Beispielcode (stark von der Website inspiriert).

%Vor%     
yanjost 04.02.2009 08:02
quelle

Tags und Links