2009-02-03 5 views
8

Ich benutze org.apache.commons.net.ftp.FTPClient und sehen, dass Verhalten, das ist ... verblüffend.Problem mit der FTPClient-Klasse in Java

Die Methode unten beabsichtigt, eine FTPFile-Liste zu durchlaufen, sie einzulesen und dann etwas mit dem Inhalt zu tun. Das funktioniert alles. Was ist nicht (wirklich) Arbeits ist, dass das FtpClient Objekt hat folgenden ...

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; 
    } 

hat jemand etwas gesehen? Ich bin neu bei FTPClient, mache ich etwas falsch damit?

+0

Könnten Sie Ihre Post bearbeiten, damit statt mit der Code-Ansicht für Ihre Liste Artikel, die Sie stattdessen die bereitgestellten Kurzwahlnummern für Listenelemente verwenden? Macht es lesbarer so :) – Kezzer

Antwort

14

Nach der API für FTPClient.retrieveFileStream(), die Methode gibt null, wenn es nicht um die Datenverbindung öffnen kann, in dem Fall, dass Sie den Antwort-Code überprüfen sollten (z getReplyCode(), getReplyString(), getReplyStrings()), um zu sehen, warum es fehlgeschlagen. Außerdem sollten Sie Dateiübertragungen abschließen, indem Sie completePendingCommand() aufrufen und überprüfen, ob die Übertragung tatsächlich erfolgreich war.

+2

completePendingComand() !!!!! Sie sind ein Gentleman UND ein Gelehrter Ich habe den replyCode (in der vorhergehenden Methode, wo ich alle Verbindung Junk), und das war alles in Ordnung. Ich habe die Dokumentation übersehen, die die Wichtigkeit von completePendingCommand spezifiziert hat. Vielen Dank. –

+0

Danke für diese Antwort Zach Scrivena! War lange mit diesem Problem fest :) – krishnang

2

Es funktioniert ok, wenn ich nach dem „abrufen“ Befehl hinzufügen:

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