使用ftpClient下載ftp上所有文件解析
需求:最新項(xiàng)目需要,寫(xiě)個(gè)小功能,需求就是實(shí)時(shí)下載ftp指定文件夾下的所有文件(包括子目錄)到本地文件夾中,保留文件到目錄路徑不變。
分析:關(guān)鍵在于實(shí)時(shí)和下載并保持原目錄。實(shí)時(shí)使用線程的定時(shí)調(diào)度完成,主要做后者,這顯然要使用遞歸,但是ftp上的文件是不能直接得到相對(duì)路徑的(恕我才疏學(xué)淺,并沒(méi)有在FTPClient類(lèi)中找到類(lèi)似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");程序之前出了寫(xiě)錯(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)文章
elasticsearch集群cluster?discovery可配式模塊示例分析
這篇文章主要為大家介紹了elasticsearch集群cluster?discovery可配式模塊示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Javabean轉(zhuǎn)換成json字符并首字母大寫(xiě)代碼實(shí)例
這篇文章主要介紹了javabean轉(zhuǎn)成json字符并首字母大寫(xiě)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02Java中的Collections類(lèi)的使用示例詳解
Collections類(lèi)提供了一些靜態(tài)方法,這些方法能夠?qū)ist集合實(shí)現(xiàn)常用的算法操作,這些算法是排序,填充,移位和查找等。本文將通過(guò)示例為大家詳細(xì)講講Collections類(lèi)的使用,需要的可以參考一下2022-12-12Spring學(xué)習(xí)筆記之RedisTemplate的配置與使用教程
這篇文章主要給大家介紹了關(guān)于Spring學(xué)習(xí)筆記之RedisTemplate配置與使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06Java中關(guān)于控制臺(tái)讀取數(shù)字或字符串的方法
下面小編就為大家?guī)?lái)一篇Java中關(guān)于控制臺(tái)讀取數(shù)字或字符串的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10使用java實(shí)現(xiàn)BBS論壇發(fā)送郵件過(guò)程詳解
這篇文章主要介紹了使用java發(fā)送郵件過(guò)程詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04