码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA ftp连接池功能实现

时间:2019-04-06 18:47:15      阅读:462      评论:0      收藏:0      [点我收藏+]

标签:抽象   logger   span   more   net   gdi   ret   rem   package   

抽象类:

package com.echo.store;

import java.util.Enumeration;
import java.util.Hashtable;

abstract class ObjectPool<T> {

    long ttl ;
    Hashtable<T,Long> lock,unlock ;

    public ObjectPool() {
        ttl = 50000;
        lock = new Hashtable<T, Long>();
        unlock = new Hashtable<T,Long>();
    }

    abstract T create();

    abstract boolean valide(T t);

    abstract void destory( T t );

    synchronized public T takeOut(){

        long now = System.currentTimeMillis();
        T t ;
        if(unlock.size() > 0){
            Enumeration<T> e = unlock.keys();
            while ( e.hasMoreElements() ){
                t = e.nextElement();
                if( ( now-unlock.get(t) > ttl) || !valide(t) ){
                    unlock.remove(t);
                    destory(t);
                    t = null;
                }else{
                    unlock.remove(t);
                    lock.put(t, ttl);
                    return t;
                }
            }
        }
        t = create();
        lock.put(t,ttl);
        return t;
    }

    synchronized public void takeIn( T t ){
        lock.remove(t);
        unlock.put( t, ttl);
    }






}

 

Ftp链接池实现类:

package com.echo.store;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

import java.io.IOException;
import java.util.Hashtable;

public class FtpPool extends ObjectPool<FTPClient> {

    FtpConfig ftpConfig;

    public static Hashtable<FtpConfig, FtpPool> instance = new Hashtable<FtpConfig, FtpPool>();

    public static final FtpPool getInstance( FtpConfig cfg ){
        if (instance.get(cfg) == null) {
            synchronized (FtpPool.class){
                if (instance.get(cfg) == null) {
                    instance.put(cfg, new FtpPool( cfg ));
                }
            }
        }
        return instance.get(cfg);
    }



    public FtpPool( FtpConfig ftpCfg ) {
        ftpConfig = ftpCfg;
    }

    @Override
    FTPClient create( ) {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(ftpConfig.getIp());
            ftpClient.login(ftpConfig.getUser(),ftpConfig.getPasswd());
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return ftpClient;
    }

    @Override
    boolean valide(FTPClient ftpClient) {
        return ftpClient.isConnected();
    }

    @Override
    void destory(FTPClient ftpClient) {
        //ftpClient.;
    }
}

 

调用方法:

   public static void main(String[] args) {

        FtpConfig cfg = new FtpConfig();
        cfg.setIp("xxx");
        cfg.setUser("xxx");
        cfg.setPasswd("vvv");
        FtpPool instance = FtpPool.getInstance(cfg);
        FTPClient ftpClient = instance.takeOut();
        FtpOperation ftpOperation = FtpOperation.getInstance();
        ftpOperation.download(ftpClient,"/remote", "./location");
    }

 

 上传方法实现:

package com.echo.services;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class FtpOperation {

    Logger log = LoggerFactory.getLogger(FtpOperation.class);

    public static FtpOperation instance = null;
    private FtpOperation() {}
    public static FtpOperation getInstance(){
        if( instance == null ){
            synchronized (FtpOperation.class){
                if (instance == null) {
                    instance = new FtpOperation();
                }
            }
        }
        return instance;
    }



    public void download(FTPClient ftpClient, String remote, String loc  ){

        try {
            log.info("remote :"+remote);
            ftpClient.changeWorkingDirectory(remote);
            //生成本地目录
            File locFile = new File(loc);
            if( !locFile.exists() ){
                locFile.mkdir();
            }
            downLoadFile(ftpClient, loc);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    private void downLoadFile( FTPClient ftpClient, String LocDir   ){

        try {
            for (FTPFile ftpFile : ftpClient.listFiles()) {
                String path = LocDir+"/"+ftpFile.getName();
                if( ftpFile.isDirectory() ){
                    //生成本地目录
                    File localFile = new File( path );
                    if( !localFile.exists() ){
                        localFile.mkdir();
                    }
                    //浏览Ftp目录
                    ftpClient.changeWorkingDirectory( ftpFile.getName());
                    downLoadFile(ftpClient, path );
                    ftpClient.changeToParentDirectory();
                }else{
                    if(
                       (   !ftpFile.getName().equals("ualice.access.log") )
                    ){
                        return;
                    }
                    FileOutputStream fostream = new FileOutputStream( path );
                    ftpClient.retrieveFile(ftpFile.getName(), fostream);
                    fostream.flush();
                    fostream.close();
                    log.info("文件:"+LocDir+ftpFile.getName()+" 下载完毕。");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }



}

 

JAVA ftp连接池功能实现

标签:抽象   logger   span   more   net   gdi   ret   rem   package   

原文地址:https://www.cnblogs.com/glory-jzx/p/10662468.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!