2017-10-09 4 views
1

Ich lade Dateien von einem Server mit FTPClient in Java. Wenn die Datei heruntergeladen wird, möchte ich ihre Integrität überprüfen und sie dann löschen. Ich mache dies, indem ich die Größe der heruntergeladenen Datei in Bytes und der Datei auf dem Server in Bytes vergleiche, aber die Ergebnisse sind nicht wie erwartet.Dateien, die ich von einem FTP-Server herunterladen, haben nicht die gleiche Länge wie die Dateien auf dem Server

Im Folgenden ein Auszug aus meinem Transferverzeichnis:

for (int i = 0; i <= insideDirectory.length - 1; i++) { 
        FTPFile transferFile = insideDirectory[i]; 
        LOGGER.info("Passing file" + folder.getName() + "/" + transferFile.getName()); 

        File downloadFile = new File("https://stackoverflow.com/users/home/example" + i + ".mp4"); 
        OutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(downloadFile)); 
        System.out.println(transferFile.getSize()); 
        ftpClient.enterLocalPassiveMode(); 
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
        InputStream inputStream = ftpClient 
          .retrieveFileStream(folder.getName() + "/" + transferFile.getName()); 
        byte[] bytesArray = new byte[4096]; 
        int bytesRead = -1; 
        while ((bytesRead = inputStream.read(bytesArray)) != -1) { 
         outputStream2.write(bytesArray, 0, bytesRead); 
        } 

        Boolean success = ftpClient.completePendingCommand(); 
        if (success) { 
         System.out.println("File #" + i + " has been downloaded successfully."); 
         checkIfExists(downloadFile, transferFile); 
        } 

Unten ist meine checkIfExists Methode

public void checkIfExists(File downloadedFile, FTPFile remoteFileToDelete) { 
    Long downloadedLength = downloadedFile.length(); 
    Long remoteLength = remoteFileToDelete.getSize(); 
    if (downloadedFile.length() == remoteFileToDelete.getSize()) { 
     LOGGER.info(downloadedLength + "exists and is the same length as " + remoteLength + ". Let's delete"); 
    } else { 
     LOGGER.info(downloadedLength + "is not the same length as " + remoteLength + ". Let's not delete"); 
    } 
} 

Hier die Ausgabe ist nach der Schleife zweimal ausgeführt wird, wie man sehen kann, ist die Größe von die heruntergeladene Datei kann variieren:

 File #0 has been downloaded successfully. 
    INFO: 7596008is not the same length as 7600840. Let's not delete 
    File #1 has been downloaded successfully. 
    INFO: 6873664is not the same length as 6878544. Let's not delete 
    File #2 has been downloaded successfully. 
    INFO: 7558112is not the same length as 7564744. Let's not delete 
    File #3 has been downloaded successfully. 
    INFO: 8662336is not the same length as 8665108. Let's not delete 

    File #0 has been downloaded successfully. 
    INFO: 7594312is not the same length as 7600840. Let's not delete 
    File #1 has been downloaded successfully. 
    INFO: 6870392is not the same length as 6878544. Let's not delete 
    File #2 has been downloaded successfully. 
    INFO: 7559184is not the same length as 7564744. Let's not delete 
    File #3 has been downloaded successfully. 
    INFO: 8660888is not the same length as 8665108. Let's not delete 
+0

Wie würde ich das überprüfen? – steam1234322

+0

Ist die Ausgabe auf der Unterseite nicht ausreichend? Es vergleicht die Größe in Bytes beider Dateien – steam1234322

+0

Ahh, ich verstehe. Dann hat Alnitak es herausgefunden. –

Antwort

3

.close() Ihre BufferedOutputStream, bevor Sie versuchen, die Größe der geschriebenen Datei zu messen.

Ohne die .close() gibt es keine Garantie (im Gegenteil), dass alle Daten, die Sie in den Stream geschrieben haben, tatsächlich in die zugrunde liegende Datei geschrieben wurden, auf die Sie über das Objekt File zugreifen.

+0

ok, wo empfehlen Sie Ich schließe outputStream2? – steam1234322

+0

Bevor Sie die Größe der Datei messen. Wie gut ist es, die Größe der Datei zu überprüfen, während Sie sie noch ändern? –

+2

Genauer gesagt, direkt nach Ihrer 'while' Schleife. –

Verwandte Themen