java FTPClient在有文件时显示空文件夹
我正在使用ApacheCommonsNetFTPClient登录并从FTP服务器读取文件。我成功登录,并且可以看到它成功登录,因为它在标题字符串中显示了工作目录路径。但是,当我使用listFiles()
时,它不显示任何文件。(我也尝试过使用listDirectories()
和listNames()
,但没有成功)
下面是一个片段:
try {
client.connect(ftpHost);
} /*catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}*/ catch (IOException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
String header ="";
InputStream stream=null;
BufferedReader reader=null;
try{
client.login(ftpUser, ftpPass);
client.changeWorkingDirectory(targetWorkingDir);
header = client.printWorkingDirectory();
//client.setFileType(FTP.BINARY_FILE_TYPE);
for(int i=0; i<client.listFiles().length;i++){
header+=client.listFiles()[i].getName() +"\n";
}
}
catch (IOException ex){
ex.printStackTrace();
header="ERROR 1: " + ex.getMessage();
for(int i=0;i<ex.getStackTrace().length;i++){
header += "\n" + ex.getStackTrace()[i];
}
}
catch(NullPointerException e){
header = "ERROR 2: "+ e.getMessage()+"\n";
for(int i=0;i<e.getStackTrace().length;i++){
header+= e.getStackTrace()[i] + "\n";
}
}
finally{
if(reader!=null){
try{reader.close();}catch(IOException e){e.printStackTrace();}
try{stream.close();}catch(IOException e){e.printStackTrace();}
}
}
我也尝试过使用类似的方法来读取文件:
try {
stream = ftpClient.retrieveFileStream("klasa.csv");
reader = new BufferedReader(new InputStreamReader(stream));
header = reader.readLine();
} finally {
if (reader != null) try { reader.close(); } catch (IOException logOrIgnore){}
}
在这两种情况下,我都非常确定自己在正确的目录下,并且通过FileZilla确保我的文件在那里,但是客户端似乎无法读取任何文件
# 1 楼答案
尽量避免在循环中调用listFiles()。每个调用都将执行整个FTP LIST命令序列,因此最终,您将为每个调用添加不必要的通信量
您可以尝试先简化程序,如下所示:
如果此程序不会提供服务器根目录中的文件列表,则可以尝试比较FileZilla FTP选项(尤其是被动/主动模式):https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode()
如果没有帮助,您可以尝试使用WireShark或tcpdump嗅探网络流量,并将命令集与FTP服务器进行比较