FtpClient同一個用戶端重複使用時,第一次下載下傳檔案正常,第二次再下載下傳檔案時,總是擷取不到檔案資訊,查找了很多文檔都沒有找到解決辦法,偶然間搜到一篇博文說每次使用FtpClient之後,調用一次ftpClient.getReply(),消耗一個FTP連結之後,下次再使用同一個用戶端連接配接就可以正常下載下傳檔案了。
後來增加了其他的一個Ftp伺服器的連接配接位址之後,發現ftpClient.getReply()調用的時候一直阻塞,導緻檔案下載下傳逾時,是以關鍵代碼:
int replyCode = ftpClient.getReplyCode(); if (200 == replyCode) { //消費一個連接配接,避免第二次擷取檔案為null的問題 ftpClient.getReply(); }
最終代碼如下:
/**
* 下載下傳該目錄下目前檔案名的到本地
*
* @param ftpPath FTP伺服器上的相對路徑,例如:test/123
* @param ftpFileName 儲存檔案到本地的路徑,例如:aaa.pdf
* @return 成功傳回true,否則傳回false
*/
public InputStream downLoadFileByName(String ftpAddress, Integer ftpPort, String ftpPath, String ftpFileName) throws Exception {
// 登入
FTPClient ftpClient = login(ftpAddress, ftpPort);
String errorMsg;
if (ftpClient != null) {
try {
String path = changeEncoding(ftpClient, (ftpPath.startsWith("/") ? "" : "/") + ftpPath);
// 判斷是否存在該目錄
if (!ftpClient.changeWorkingDirectory(path)) {
errorMsg = ftpPath + DIR_NOT_EXIST;
log.error(errorMsg);
throw new Exception(errorMsg);
}
int replyCode = ftpClient.getReplyCode();
if (200 == replyCode) {
//消費一個連接配接,避免第二次擷取檔案為null的問題
ftpClient.getReply();
}
// 判斷該目錄下是否有檔案
String[] fs = ftpClient.listNames(ftpFileName);
if (fs == null || fs.length == 0) {
errorMsg = ftpPath + DIR_CONTAINS_NO_FILE + "==fileName:" + ftpFileName;
log.error(errorMsg);
throw new Exception(errorMsg);
}
InputStream inputStream = ftpClient.retrieveFileStream(ftpFileName);
return inputStream;
} catch (Exception e) {
log.error(e.getMessage(), e);
closeConnect(ftpAddress);
throw e;
}
}
return null;
}
以上隻是個人見解,如有不對的地方請各位指正,謝謝~