如何在Java中将FTPFile列表转换为文件列表?
我有一个FTP文件列表,我只能将第一个如何在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
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
的内容。我已经更新了代码。非常感谢您的回答。我被困了一天了。