2009-02-03 5 views
8

Я использую org.apache.commons.net.ftp.FTPClient и вижу поведение, которое ... хорошо.Проблема с классом FTPClient в java

Метод, предназначенный для перехода через список FTPFile, прочитать их и затем сделать что-то с содержимым. Это все работает. Что не является (на самом деле) рабочий является то, что объект FTPClient выполняет следующие ...

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

кто-нибудь видел что-нибудь подобное? Я новичок в FTPClient, я что-то делаю с этим?

+0

Не могли бы вы изменить свой пост таким образом, вместо того, чтобы использовать представление кода для элементов списка вы вместо того, чтобы использовать предоставленные шорткоды для элементов списка? Делает это более читаемым таким образом :) – Kezzer

ответ

14

Согласно API для FTPClient.retrieveFileStream(), метод возвращает null, когда он не может открыть соединение для передачи данных, в этом случае вы должны проверить код ответа (например, getReplyCode(), getReplyString(), getReplyStrings()), чтобы понять, почему это не удалось. Кроме того, вы предполагаете завершить передачу файлов, позвонив по телефону completePendingCommand() и проверив, что передача действительно успешна.

+2

completePendingComand() !!!!! Вы джентльмен И ученый Я проверял replyCode (в предыдущем методе, где я делаю все мусор соединения), и все это работает нормально. Я упустил из виду документацию, в которой указано значение completePendingCommand. Большое спасибо. –

+0

Спасибо за этот ответ Зак Скривена! Застрял с этой проблемой в течение длительного времени :) – krishnang

2

Это хорошо работает, когда я добавляю после команды «извлечения»:

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

 Смежные вопросы

  • Нет связанных вопросов^_^