使用ftpClient下載ftp上所有文件解析
需求:最新項(xiàng)目需要,寫個(gè)小功能,需求就是實(shí)時(shí)下載ftp指定文件夾下的所有文件(包括子目錄)到本地文件夾中,保留文件到目錄路徑不變。
分析:關(guān)鍵在于實(shí)時(shí)和下載并保持原目錄。實(shí)時(shí)使用線程的定時(shí)調(diào)度完成,主要做后者,這顯然要使用遞歸,但是ftp上的文件是不能直接得到相對(duì)路徑的(恕我才疏學(xué)淺,并沒(méi)有在FTPClient類中找到類似getPath()的方法),因此路徑是要自己記錄??傮w思路有以下:
1、得到所有路徑以及子路徑:遞歸遍歷所有文件到路徑。參數(shù):ftp為FTPClient對(duì)象,path為當(dāng)前的路徑,pathArray保存當(dāng)前的路徑,并將此路徑集合帶到主函數(shù)中去
getPath(ftp,path,pathArray);
public static void getPath(FTPClient ftp,String path,ArrayList<String> pathArray) throws IOException{
FTPFile[] files = ftp.listFiles();
for (FTPFile ftpFile : files) {
if(ftpFile.getName().equals(".")||ftpFile.getName().equals(".."))continue;
if(ftpFile.isDirectory()){//如果是目錄,則遞歸調(diào)用,查找里面所有文件
path+="/"+ftpFile.getName();
pathArray.add(path);
ftp.changeWorkingDirectory(path);//改變當(dāng)前路徑
getPath(ftp,path,pathArray);//遞歸調(diào)用
path=path.substring(0, path.lastIndexOf("/"));//避免對(duì)之后的同目錄下的路徑構(gòu)造作出干擾,
}
}
}
2、下載到指定的本地文件夾中,
download(ftp, pathArray, "c:\\download");程序之前出了寫錯(cuò)誤,為了排查,我把下載分成兩部分,第一部分先將所有目錄創(chuàng)建完成,在第二個(gè)for循環(huán)中進(jìn)行文件的下載。參數(shù):ftp為FTPClient,pathArray為1中帶出的路徑集合,后面一個(gè)String為本地路徑
public static void download(FTPClient ftp,ArrayList<String> pathArray,String localRootPath) throws IOException{
for (String string : pathArray) {
String localPath=localRootPath+string;
File localFile = new File(localPath);
if (!localFile.exists()) {
localFile.mkdirs();
}
}
for (String string : pathArray) {
String localPath=localRootPath+string;//構(gòu)造本地路徑
ftp.changeWorkingDirectory(string);
FTPFile[] file=ftp.listFiles();
for (FTPFile ftpFile : file) {
if(ftpFile.getName().equals(".")||ftpFile.getName().equals(".."))continue;
File localFile = new File(localPath);
if(!ftpFile.isDirectory()){
OutputStream is = new FileOutputStream(localFile+"/"+ftpFile.getName());
ftp.retrieveFile(ftpFile.getName(), is);
is.close();
}
}
}
}
測(cè)試的主函數(shù),使用的ftpClient為org.apache.commons.net.ftp.FTPClient:
public static void main(String[] args) throws SocketException, IOException {
FTPClient ftp = new FTPClient();
ftp.connect("127.0.0.1");
ftp.login("test","test");
int reply;
reply = ftp.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
System.err.println("FTP server refused connection.");
System.exit(1);
}
ftp.setBufferSize(1024);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
String path="";
ArrayList<String> pathArray=new ArrayList<String>();
getPath(ftp,path,pathArray);
System.out.println(pathArray);
download(ftp, pathArray, "c:\\download");
ftp.logout();
ftp.disconnect();
}
以上所述是小編給大家介紹的使用ftpClient下載ftp上所有文件,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Mybatis映射文件之常用標(biāo)簽及特殊字符的處理方法
這篇文章主要介紹了Mybatis映射文件常用標(biāo)簽及特殊字符的處理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Java使用貪心算法解決電臺(tái)覆蓋問(wèn)題(示例詳解)
貪心算法是指在對(duì)問(wèn)題進(jìn)行求解時(shí),在每一步選擇中都采取最好或最優(yōu)的選擇,從而導(dǎo)致結(jié)果理想化,下面通過(guò)本文介紹下Java使用貪心算法解決電臺(tái)覆蓋問(wèn)題,需要的朋友可以參考下2022-04-04
Apache Maven創(chuàng)建工程的實(shí)現(xiàn)示例
本文詳細(xì)介紹了如何使用Maven創(chuàng)建一個(gè)新的Java工程,包括使用maven-archetype-plugin插件、項(xiàng)目的基本結(jié)構(gòu)和文件、構(gòu)建和運(yùn)行項(xiàng)目的方法以及常見問(wèn)題的解決,Maven通過(guò)簡(jiǎn)化項(xiàng)目構(gòu)建和依賴管理,成為Java開發(fā)中不可或缺的工具2024-11-11
SpringBoot使用郵箱發(fā)送驗(yàn)證碼實(shí)現(xiàn)注冊(cè)功能
這篇文章主要為大家詳細(xì)介紹了SpringBoot使用郵箱發(fā)送驗(yàn)證碼實(shí)現(xiàn)注冊(cè)功能實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
ASM源碼學(xué)習(xí)之ClassReader、ClassVisitor與ClassWriter詳解
這篇文章主要給大家介紹了ASM源碼之ClassReader、ClassVisitor與ClassWriter的相關(guān)資料,文中介紹的非常相信,相信對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01
Value注解支持對(duì)象類型ConfigurationProperties功能
這篇文章主要為大家介紹了Value注解支持對(duì)象類型ConfigurationProperties功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
BigDecimal divide除法除不盡報(bào)錯(cuò)的問(wèn)題及解決
這篇文章主要介紹了BigDecimal divide除法除不盡報(bào)錯(cuò)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
詳解如何解決SSM框架前臺(tái)傳參數(shù)到后臺(tái)亂碼的問(wèn)題
這篇文章主要介紹了詳解如何解決SSM框架前臺(tái)傳參數(shù)到后臺(tái)亂碼的問(wèn)題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12

