JAVA ftp连接池功能实现

抽象类:

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();
        }

    }

}

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

时间: 2024-11-04 14:58:41

JAVA ftp连接池功能实现的相关文章

《java数据源—连接池》

<java数据源-连接池>1.数据源的分类:直接数据源.连接池数据源.2.连接池.数据源.JNDI a.数据源:Java中的数据源就是连接到数据库的一条路径,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接. b.连接池:简单的说就是保存所有的数据库连接的地方,在系统初始化时,将数据库连接对象存储到内存里,当用户需要访问数据库的时候,并不是建立一个新的连接,而是从连接池中 取出一个已经建立好的空闲连接对象.而连接池负责分配.管理.释放数据库连接对象.注意的是:连接池是由容

java自定义连接池

1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或"释放资源"是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Connection 用池来管理Connection,这样可以重复使用Connection,有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象,当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection

Java创建连接池连接不同数据库

在一个应用里面,可能涉及到连接多个不同数据库进行操作,而每次连接写不同的实现会很麻烦.前面已经会了用JDBC连接数据库,那么利用反射和工厂模式,可以实现连接不同的数据库,这样处理起来将会很方便.同时建造数据库连接池,处理多个业务数据处理. 那么具体怎么实现呢,下面一起来看一下: 整体结构如下: 第一步,先处理连接不同数据库 1.首先,将数据库配置信息创建一个公用类:JdbcUrl.java 主数据库可以用默认的构造方法,如果是连接其他库,则通过传递参数的方式来处理. 数据库参数有如下几个: 1

ftp连接池客户端

package com.scenetec.isv.utils.ftp.core; import com.scenetec.isv.utils.ftp.config.FtpClientProperties;import lombok.extern.slf4j.Slf4j;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPReply;import org.apache.commons.po

Java c3p0连接池

import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; import javax.sql.ConnectionPoolDataSource; import javax.swing.text.DefaultEditorKit.InsertBreakAction; import com.mchange.v2.c3p0.ComboPooledDataSource

java dbcp连接池,大数据处理循环多表操作插入事例

基础连接池类: package com.yl.sys.dao; import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import java.util.Vector; public class ConnectionPoolTool { private Vector<Connection> pool; private String

Java的连接池技术

如何使用JNDI(Java Naming and Directory Interface)是一个应用程序接口,为开发人员提供了查找和访问各种命名和目录服务的通用,统一的接口,类似JDBC都是构建在抽象层上.JNDI提供了一种统一的方式,可以用在网络上查找和访问服务.通过指定一个资源名称,该名称对应于数据库或命名服务中的一个一个记录,同时返回数据库连接建立所必需的信息. 在实际开发中,我们有时候还会使用服务器提供给我们的数据库连接池,比如我们希望Tomcat服务器在启动的时候可以帮助我们创建一个数

Java Redis 连接池 Jedis 工具类

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.io.IOException; import java.io.InputStream; import java.util.Prop

Java——DBCP连接池

p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; text-align: justify; widows: 0; orphans: 0 } p.western { font-family: "Calibri", sans-serif; font-size: 10pt } p.cjk { font-family: "宋体", "SimSun";