2012-03-23 107 views
4

我的要求是從不同的目錄中獲得所需文件擴展名的文件列表,並獲取文件本身時,我應該得到輸入流並做一些處理.... I我試圖獲得所需文件擴展名的文件列表,然後我試圖從列表中的所有選定文件獲取輸入流。 對於第一次迭代,我得到所需的文件,我也得到一個文件的流,但對於下一個文件,我得到一個空指針異常。我也無法從第二次迭代得到的文件列表,我用來測試Commons FTPClient從一個連接中的多個文件的InputStream

示例代碼:

 System.out.println(ftp.printWorkingDirectory()); 
     boolean status = ftp 
       .changeWorkingDirectory("mydirectory"); 
     System.out.println("Status of Change Directory:" + status); 
     System.out.println(ftp.printWorkingDirectory()); 
     InputStream is = null; 

     System.out.println(ftp.printWorkingDirectory()); 
     System.out.println(ftp.isConnected()); 

     FTPFile[] list2 = ftp.listFiles(); 
     System.out.println("Number of files in this directory:" 
       + list2.length); 
     for (int i = 0; i < list2.length; i++) { 
      System.out.println("-------[" + list2[i].getName() 
        + "]---------------------"); 
      is = ftp.retrieveFileStream(list2[i].getName()); 
      int bytesRead = 0; 
      byte[] buffer = new byte[1024]; 
      while ((bytesRead = is.read(buffer, 0, buffer.length)) > 0) { 
       System.out.println(new String(buffer, 0, bytesRead)); 
      } 
      //is.close(); 

      System.out.println("-------[END:" + list2[i].getName() 
        + "]---------------------"); 
     } 

文件的計數顯示爲3和第一個文件中的「mydirectory中」讀取正確,但當它試圖讀取第二個文件它說空指針異常....另外,我讀取流使用retrieveFileStream方法後,如果我嘗試打印當前工作目錄,它給出了空值,但它表示它仍然連接....

請讓我知道,如果我有我的代碼中的一些錯誤.... 唯一的解決方法我是連接到每個輸入流讀取的ftp位置,這是不是一件好事情....

回答

0

有兩個優化,我會建議。首先,我會推薦使用FTPClient.listNames。這將返回一個字符串數組。 其次,使用IOUtils.readFully(inputStream)返回文件中內容的字符串表示。

現在要解決這個問題,我假設你在locl被動模式下執行這些命令。在你的上面的代碼中包含這個ftp.retreiveFileStream。

ftp.enterLocalPassiveMode(); 
ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 
ftp.setRemoteVerificationEnabled(false); 
4
System.out.println(ftp.printWorkingDirectory()); 
     boolean status = ftp 
       .changeWorkingDirectory("mydirectory"); 
     System.out.println("Status of Change Directory:" + status); 
     System.out.println(ftp.printWorkingDirectory()); 
     InputStream is = null; 

     System.out.println(ftp.printWorkingDirectory()); 
     System.out.println(ftp.isConnected()); 

     FTPFile[] list2 = ftp.listFiles(); 
     System.out.println("Number of files in this directory:" 
       + list2.length); 
     for (int i = 0; i < list2.length; i++) { 
      System.out.println("-------[" + list2[i].getName() 
        + "]---------------------"); 
      is = ftp.retrieveFileStream(list2[i].getName()); 
      int bytesRead = 0; 
      byte[] buffer = new byte[1024]; 
      while ((bytesRead = is.read(buffer, 0, buffer.length)) > 0) { 
       System.out.println(new String(buffer, 0, bytesRead)); 
      } 
      is.close(); 
      while(!ftpClient.completePendingCommand()); 
      System.out.println("-------[END:" + list2[i].getName() 
        + "]---------------------"); 
     } 

而(ftpClient.completePendingCommand()!); 要完成文件傳輸,您必須調用completePendingCommand()並檢查其返回值以驗證成功。

有一些FTPClient方法不能完成完整的FTP命令來完成一個事務。這些命令在接收到正中間命令後需要編程人員採取一些措施。在程序員的代碼完成其操作後,它必須調用此方法來接收來自服務器的完成答覆並驗證整個事務的成功。這就是公共API所說的,http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#retrieveFileStream(java.lang.String)