我创建了从FTP服务器下载文件的Java功能。它可以在我的本地机器上正常工作。但我需要在linux服务器下运行它(意味着另一个主机和端口)。并且该函数给出了错误
The collection, array, map, iterator, or enumeration portion of a for statement cannot be null
在代码行中出现:
for(String f : ftpNames) {
ftpclient.retrieveFile(f, os); // os is OutputStream
}
所以它没有看到文件...... 我添加了
ftpclient.enterRemotePassiveMode();
ftpclient.getPassiveHost()
返回227 Entering Passive Mode (x,x,x,x,204,15)
尝试通过 shell 列出并下载它们 - 它有效。
我应该如何修改代码来解决问题?感谢。
UPD 即可。我从FTP服务器获取日志我试图从中获取文件,并且有这样的字符串:
425 Cannot open data connection
完整代码:
static boolean ftpFilesDownload(String ip, int port, String login, String passwd, String ftpdir, String localdir) throws IOException {
Boolean result = false;
FTPClient client = new FTPClient();
String separator = File.separator;
try {
client.connect(ip, port);
System.out.println(client.getReplyString());
client.login(login, passwd);
System.out.println(client.getReplyString());
client.setControlKeepAliveTimeout(1000*60*5);
client.setControlKeepAliveReplyTimeout(1000*60*5);
client.setFileType(FTP.BINARY_FILE_TYPE);
System.out.println("client setFileType success");
client.changeWorkingDirectory(ftpdir);
System.out.println(client.getReplyString());
client.printWorkingDirectory();
System.out.println("directory changed");
FTPFile[] ftpFiles = client.listFiles();
System.out.println(ftpFiles);
String[] ftpNames = client.listNames();
System.out.println("the files are " + Arrays.toString(ftpNames)); // so null here...
for(String f : ftpNames) {
String localfile = localdir + f;
OutputStream os = new FileOutputStream(localfile);
try {
result = client.retrieveFile(f, os);
System.out.println("DOWNLOADING STARTED);
System.out.println(client.getReplyString());
client.noop();
}
catch(Exception e) {
System.out.println(e);
result = false;
}
finally {
if(os != null)
os.close();
}
}
client.logout();
System.out.println(client.getReplyString());
}
catch(Exception e)
{
System.out.println(e);
result = false;
}
finally
{
try
{
client.disconnect();
}
catch(Exception e)
{
System.out.println(e);
result = false;
}
}
return result;
}
答案 0 :(得分:0)
正如错误消息所解释的那样,您正在尝试迭代null
对象。你应该检查一下(或确保使用空的Iterable)
如果这是一个execptional(错误)状态,我会明确地检查它并抛出某种运行时异常,例如:
if (ftpNames == null) {
throw new IllegalArgumentException("Cannot use a null set of FTP servers");
}
for (String f : ftpNames) {
ftpclient.retrieveFile(f, os); // os is OutputStream
}
或者你可以尝试继续没有FTP服务器,但似乎有点无意义。
答案 1 :(得分:-1)
尝试使用 ftpclient.enterLocalActiveMode();