java實現FTP下載文件

ftp上傳下載文件,是遵守ftp協議上傳下載文件的,本例僅如下載文件爲例。java

重要的方法解釋:apache

1.FTP功能相關依賴路徑:org.apache.commons.net.ftp.*;服務器

2.ftp默認端口是21,若是非默認端口鏈接,需指定:ftp.connect(ftphostaddr, 22);//22爲端口號url

3.ftp.changeWorkingDirectory(ftppath) //實現切換目錄.net

4.FTPFile[] fs = ftp.listFiles(); 獲取指定目錄下的文件列表blog

public class FtpTools {
	
    private final static String ftphostaddr = "xxx";//服務器地址
    private final static String ftppath = "xxx";//操做的服務器目錄
    private final static String ftpname = "xxx";//服務器登陸名
    private final static String ftppwd = "xxx";//登陸密碼
  
    private final static String localpath = getCurentContentPath()+"uploadfiles";
    private final static String fileSeparator = System.getProperty("file.separator");
    
    private static final Logger LOGGER = Logger.getLogger(FtpTools.class);
    
	public static void main(String[] args) {
		FtpTools tools = new FtpTools();
		tools.downFile("test.txt");
	}
	
	/**
	 * 從文件服務器上下載文件到本地
	 * @param filename
	 */
	 public static void downFile(String filename) {
		 FTPClient ftp = initFtp(); 
		 try{
	            //4.指定要下載的目錄  
	            ftp.changeWorkingDirectory(ftppath);// 轉移到FTP服務器目錄  
	            //5.遍歷下載的目錄  
	            FTPFile[] fs = ftp.listFiles();  
	            for (FTPFile ff : fs) {  
	                //解決中文亂碼問題,兩次解碼  
	                byte[] bytes=ff.getName().getBytes("iso-8859-1");  
	                String fn=new String(bytes,"utf8");
	                if (fn.equals(filename)) {  
	                    //6.寫操做,將其寫入到本地文件中  
	                   LOGGER.info("下載文件:"+filename+"開始:"+System.currentTimeMillis());
	                    File localFile = new File(localpath +fileSeparator+ ff.getName());  
	                    OutputStream is = new FileOutputStream(localFile);  
	                    ftp.retrieveFile(ff.getName(), is);
	                    
	                    //7.判斷本地文件是否正確寫入,若是正確寫入,將文件服務器上的文件刪除
	                    if(localFile.exists()){
	                    	LOGGER.info("刪除服務器上文件:"+filename);
	                    	ftp.deleteFile(ff.getName());
	                    }
	                    LOGGER.info("下載文件:"+filename+"結束:"+System.currentTimeMillis());
	                    is.close();  
	                }  
	            }  
	            ftp.logout();  
		 }catch(Exception e){
			 e.printStackTrace();
			 new Exception("從服務器下載文件過程當中發生錯誤");
		 }finally{
			 if (ftp.isConnected()) {  
	                try {  
	                    ftp.disconnect();  
	                } catch (IOException ioe) {  
	                	ioe.printStackTrace();
	                }  
	            }  
		 }
	 }
	 
	public static FTPClient initFtp() {
		int reply;
		FTPClient ftp = new FTPClient();
		try {
			// 1.鏈接服務器
			//ftp.connect(ftphostaddr);
			ftp.connect(ftphostaddr, 22);
			// 2.登陸服務器 若是採用默認端口,能夠使用ftp.connect(url)的方式直接鏈接FTP服務器
			ftp.login(ftpname, ftppwd);
			// 3.判斷登錄是否成功
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
			}
		} catch (Exception e) {
			e.printStackTrace();
			new Exception("服務器鏈接失敗");
		}
		return ftp;
	}
	 
	 public static String getCurentContentPath(){
		 String path = "";
		 path = FtpTools.class.getClassLoader().getResource("").toString();
		 path = path.replace("file:", "").substring(0, path.indexOf("WEB-INF")).replace("WEB-IN", "").replace("WEB-I", "");
		 return path;
	 }
}
相關文章
相關標籤/搜索