2010-09-03 11 views
0

Je travaille dans le développement d'une application. Sur cette application, j'effectue des opérations de stockage, de récupération et de suppression de fichiers. Pour identifier les fichiers sur le serveur, j'utilise un fichier d'index (fichier de hachage). chaque fois que j'effectue une opération de téléchargement, je mets à jour le fichier "index" et charge le fichier "index" sur le serveur avec d'autres fichiers de téléchargement. Pour effectuer une opération de suppression, je récupère d'abord le fichier "index" et, en fonction de l'index, je supprime les fichiers du serveur et après la mise à jour du fichier "index" je télécharge à nouveau le fichier "index" sur le serveur.Un problème lors de la récupération du fichier à partir du serveur FTPS

Je suis en mesure d'effectuer une opération de téléchargement de fichiers avec succès, mais lors d'une opération de suppression, j'obtiens une exception "java.io.EOFException", lorsque j'essaie de récupérer le fichier "index".

je suis en train d'écrire le code ci-dessous pour télécharger le fichier « index » du serveur FTPS

//download index file 
if (service.retrFile("INDEX", "") == service.OK) { 
    try { 
     ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("INDEX")); 
     try { 
     Map<String, FileData> filesUploaded = (HashMap<String, FileData>) objIn.readObject(); 

     } catch (ClassNotFoundException ex) { 
      ex.printStackTrace(); 
     } 
     objIn.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

Où « service.ok » retourne « 0 » si elle est correctement connecté au serveur FTPS et « FileData » contient des informations A propos du fichier (attributs).

Même code que j'utilise pour effectuer une opération de téléchargement. là ça fonctionne bien sans exception. mais tout en effectuant une opération de suppression lorsque je suis en train de récupérer le fichier "index" je reçois une exception sur l'instruction:

Carte filesUploaded = (HashMap) objIn.readObject();

Exception est:

GRAVE: null

java.io.EOFException 
     at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2298) 
     at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2767) 
     at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:798) 
     at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298) 
     at com.pixelvault.gui.DeleteServerFilesDialog.startDeleting(DeleteServerFilesDialog.java:447) 

j'ai vérifié si les connexions du serveur FTPS sont correctement fermés après avoir effectué les opérations correspondantes. Je ne comprends pas où je me trompe.

s'il vous plaît donnez-moi vos précieuses suggestions. Je remercie toutes vos suggestions qui m'aideront à surmonter ce problème.


J'utilise org.apache.commons.net.ftp et « retrFile » est une méthode créée par moi pour récupérer les fichiers du serveur.

est ici le code pour "retrFile"

FTPSClient ftp; Public int retrFile (String nom de fichier, String savePath) { if (! Connected) { return ERR; }

FileOutputStream fout = null; 
    InputStream bin = null; 
    try { 
     ftp.enterLocalPassiveMode(); 
     fout = new FileOutputStream(savePath + filename); 
     bin = ftp.retrieveFileStream(filename); 
     if (bin == null) { 
      fout.close(); 
      return ERR; 
     } 
     byte[] b = new byte[ftp.getBufferSize()]; 
     int bytesRead = 0; 
     while ((bytesRead = bin.read(b, 0, b.length)) != -1) { 
      fout.write(b, 0, bytesRead); 
     } 
     ftp.completePendingCommand(); 
     fout.close();   
    } catch (FTPConnectionClosedException ex) { 
     ex.printStackTrace(); 
     connected = false; 
     return NOT_CONNECTED; 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
     return ERR; 
    } finally { 
     try { 
      fout.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return ERR; 
     } 
     try { 
      if (bin != null) { 
       bin.close(); 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 

      return ERR; 
     } 
    } 
    return OK; 
} 

Répondre

1

Êtes-vous sûr que le fichier INDEX est téléchargé correctement?

Est-il présent dans le système de fichiers lorsque l'application est fermée?

Quelle bibliothèque FTP utilisez-vous? Je ne connais que Commons.net d'Apache et je ne reconnais pas la méthode du fichier "retrFile". Pourrait-il être threadé de sorte que le fichier ne soit pas complètement téléchargé lorsque l'instruction readObject est exécutée?