2012-03-23 106 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)