2009-02-03 16 views
8

J'utilise org.apache.commons.net.ftp.FTPClient et je vois un comportement qui est, bien ... perplexe.Problème avec la classe FTPClient dans java

La méthode ci-dessous a l'intention de parcourir une liste FTPFile, de la lire et de faire quelque chose avec le contenu. Tout fonctionne. Qu'est-ce pas (vraiment) travail est que l'objet ClientFTP effectue les opérations suivantes ...

1) Properly retrieves and stores the FIRST file in the list 
2) List item evaluates to NULL for x number of successive iterations of the loop (x varies on successive attempts 
3) manages to retrieve exactly 1 more file in the list 
4) reports that it is null for exactly 1 more file in the list 
5) hangs indefinitely, reporting no further activity. 

public static String mergeXMLFiles(List<FTPFile> files, String rootElementNodeName, FTPClient ftp){ 
     String ret = null; 
     String fileAsString = null; 
     //InputStream inStream; 
     int c; 

     if(files == null || rootElementNodeName == null) 
      return null; 
     try { 
      System.out.println("GETTING " + files.size() + " files"); 
      for (FTPFile file : files) { 
       fileAsString = ""; 
       InputStream inStream = ftp.retrieveFileStream(file.getName()); 

       if(inStream == null){ 
        System.out.println("FtpUtil.mergeXMLFiles() couldn't initialize inStream for file:" + file.getName()); 

        continue;//THIS IS THE PART THAT I SEE FOR files [1 - arbitrary number (usually around 20)] and then 1 more time for [x + 2] after [x + 1] passes successfully. 
       } 
       while((c = inStream.read()) != -1){ 

        fileAsString += Character.valueOf((char)c); 
       } 
       inStream.close(); 


       System.out.println("FILE:" + file.getName() + "\n" + fileAsString); 
      } 


     } catch (Exception e) { 
      System.out.println("FtpUtil.mergeXMLFiles() failed:" + e); 
     } 
     return ret; 
    } 

Quelqu'un at-il vu quelque chose comme ça? Je suis nouveau sur FTPClient, est-ce que je fais quelque chose de mal avec ça?

+0

Pouvez-vous modifier votre message si au lieu d'utiliser la vue de code pour vos éléments de liste utilisez plutôt les shortcodes fournies pour les articles de la liste? Le rend plus lisible de cette façon :) – Kezzer

Répondre

14

Selon voir pourquoi il n'a pas l'API pour FTPClient.retrieveFileStream(), la méthode retourne null quand il ne peut pas ouvrir la connexion de données, dans ce cas, vous devriez vérifier le code de réponse (par exemple getReplyCode(), getReplyString(), getReplyStrings()). En outre, vous êtes supposé finaliser les transferts de fichiers en appelant completePendingCommand() et en vérifiant que le transfert a bien été effectué.

+2

completePendingComand() !!!!! Vous êtes un gentleman ET un érudit Je vérifiais le replyCode (dans la méthode précédente où je fais tous les déchets de connexion) et tout fonctionnait bien. J'ai négligé la documentation qui spécifiait l'importance de completePendingCommand. Merci beaucoup. –

+0

Merci pour cette réponse Zach Scrivena! A été coincé avec ce problème pendant une longue période :) – krishnang

2

Il fonctionne bien quand j'ajoute après le « récupérer » commande:

 int response = client.getReply(); 
     if (response != FTPReply.CLOSING_DATA_CONNECTION){ 
      //TODO 
     }