Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中将FTPFile列表转换为文件列表?_Java_File_Ftp_Apache Commons_Ftp Client - Fatal编程技术网

如何在Java中将FTPFile列表转换为文件列表?

如何在Java中将FTPFile列表转换为文件列表?,java,file,ftp,apache-commons,ftp-client,Java,File,Ftp,Apache Commons,Ftp Client,我有一个FTP文件列表,我只能将第一个FTPFile转换为文件。我正在使用org.apache.commons.net.ftp库。 我的代码第一次运行良好: for (FTPFile file : files) { if(ftpClient.sendNoOp()){ if(file.getName()!=null || !file.getName().equals("")) { InputStream iStream=ftpClient.retrieveFileS

我有一个FTP文件列表,我只能将第一个
FTPFile
转换为
文件
。我正在使用
org.apache.commons.net.ftp
库。
我的代码第一次运行良好:

for (FTPFile file : files) {
  if(ftpClient.sendNoOp()){
   if(file.getName()!=null || !file.getName().equals("")) {
           InputStream iStream=ftpClient.retrieveFileStream(file.getName());
           File file2 = File.createTempFile("xml", null);
           FileUtils.copyInputStreamToFile(iStream, file2);
           iStream.close();
                }
  }
}
从该代码中,循环只遍历一次,
FTPFile
被转换为
文件
,然后它将得到异常,该异常是由
ftpClient.retrieveFileStream(File.getName())
中生成的
null
值创建的
请提供帮助。

来自
FTPClient#listFiles()的Javadoc:

注意:如果任何单个文件列表无法解析,则此数组可能包含空成员。调用方应在引用每个条目之前检查其是否为null


您必须检查数组中返回的每个项目是否为null,否则您将获得NPE。

您必须在下载文件后完成传输。这就是为什么您能够下载第一个文件,而第二个文件的下载有问题的原因

 success = ftpClient.completePendingCommand();
 if (success) {
                System.out.println("File has been downloaded successfully.");
  }

如果问题仍然存在,您可以调用ftpClient.getReplyCode(),这将让您知道无法下载该文件的原因。通常,retrieveFileStream在无法打开数据连接时返回null

请查看FTPFile.getName()返回的内容。我怀疑它只返回文件名,而不是retrieveFileStream所期望的整个文件路径。它应该是一个名称,除了临时文件之外,没有任何本地文件。但是,据我所知,您没有关闭输入流吗?也许您需要在开始新的文件传输之前完成第一次文件传输?添加一个try with resources块,看看这是否有帮助。FTPFile.getName()在evey循环中获取文件名..并且在第一个循环或第一个文件中工作正常@rlm@user2612030我已关闭输入流,但仍然出现相同的错误。请捕获异常并为失败的文件写入文件名。可能是您试图获取一个目录或某种无法读取的特殊文件。谢谢,JIM Gorrison。我已经检查过了,它不能在文件中检索空值。请更新原始问题中的代码,以显示检查
null
的内容。我已经更新了代码。非常感谢您的回答。我被困了一天了。