Java访问FTP

    这里只提供Java从FTP下载文件(获取文件流)的示例。

/**
 * 文件工具类
 * 
 */
public final class FileUtil
{
	/**
	 * 加载properties配置文件
	 * 
	 * @param filePath properties配置文件
	 * @return         返回Properties对象
	 */
	public static Properties loadProperties(String filePath)
	{
		Properties properties = new Properties();
		
		try
		{
			properties.load(new FileInputStream(new File(filePath)));
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
		return properties;
	}
}
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

/**
 * FTP操作器
 */
public class FTPHandler
{
	/**
	 * 日志实例
	 */
	private static final Logger logger = Logger.getLogger(FTPHandler.class);
	
	/**
	 * classes文件夹根目录全路径
	 */
	private static final String CLASS_PATH = FTPHandler.class.getResource("/").getPath().substring(1);
	
	/**
	 * config目录名称
	 */
	private static final String CONFIG_DIR = "config"; 
	
	/**
	 * ftp连接配置
	 */
	private Properties ftpConfig;
	
	/**
	 * FTPHandler 单粒对象
	 */
	public static FTPHandler instance;
	
	/**
	 * 构造方法私有化
	 */
	private FTPHandler()
	{
		this.init();
	}
	
	/**
	 * 
	 */
	private void init()
	{
		//ftp配置文件路径
		String ftpConfigPath = CLASS_PATH.substring(0, CLASS_PATH.length() - 8) + FTPHandler.CONFIG_DIR + "/" + "ftpserver.properties";
		
		ftpConfig = FileUtil.loadProperties(ftpConfigPath);
	}
	
	/**
	 * 获取FTPHandler单粒对象
	 * 
	 * @return
	 */
	public static synchronized FTPHandler getInstance()
	{
		if (null == instance)
		{
			instance = new FTPHandler();
		}
		
		return instance;
	}
	
	/**
	 * 根据区域标记。不同的区域使用不同的账号登陆FTP
	 * 
	 * @param areaFlag 区域标记
	 * @param filePath 文件路径
	 * @return
	 */
	public InputStream  getInputStream(String areaFlag, String filePath)
	{
		FTPClient ftp = this.ftpFactory(areaFlag);
		
		InputStream in = null;
		
		try
		{
			in = ftp.retrieveFileStream(filePath);
		}
		catch (IOException e)
		{
			logger.error("获取文件流失败,文件路径:" + filePath, e);
		}
		
		this.closeFtp(ftp);
		
		return in;
	}
	
	/**
	 * ftpClient对象工厂方法
	 * 
	 * @param areaFlag 区域标记 目前不同的区域使用不同的FTP登陆账号
	 * @return
	 */
	private FTPClient ftpFactory(String areaFlag)
	{
		FTPClient ftp = new FTPClient();
		
		if (null != ftpConfig.getProperty("ftp.controlkeepalivetimeout"))
		{
			ftp.setControlKeepAliveTimeout(Long.valueOf(ftpConfig.getProperty("ftp.controlkeepalivetimeout")));
		}
		
		try
		{
			//ftp服务器地址
			ftp.connect(ftpConfig.getProperty("ftp.server"));
			
			int reply = ftp.getReplyCode();
			
			//检查连接是否正常
			if (!FTPReply.isPositiveCompletion(reply))
            {
                ftp.disconnect();
                
                logger.error("FTP服务器拒绝连接!");
            }
			
			//登陆
			if (!ftp.login(getAccountInfoByFlag(areaFlag, "username"), this.getAccountInfoByFlag(areaFlag, "password")))
            {
                ftp.logout();
            }
			else
			{
				//二进制传输
				ftp.setFileType(FTP.BINARY_FILE_TYPE);
			}
		}
		catch (Exception e)
		{
			logger.error("创建ftpClient对象失败!", e);
		}
		
		return ftp;
	}
	
	private void closeFtp(FTPClient ftp)
	{
		try
		{
			ftp.noop();
			
			ftp.logout();
		}
		catch (IOException e)
		{
			logger.error("ftpClient登出失败!", e);
		}
		finally
        {
            if (ftp.isConnected())
            {
                try
                {
                    ftp.disconnect();
                }
                catch (IOException f)
                {
                	logger.error("ftp连接关闭失败!", f);
                }
            }
        }
	}
	
	/**
	 * 获取账号信息
	 * 
	 * @param areaFlag 区域缩写
	 * @param suffix   properties后缀
	 * @return         返回账号信息
	 */
	private String getAccountInfoByFlag(String areaFlag, String suffix)
	{
		//默认情况key值
		String key = "ftp." + suffix;
		
		if (null != areaFlag && !"".equals(areaFlag))
		{
			key = "ftp." + areaFlag + "_" + suffix;
		}
		
		return ftpConfig.getProperty(key);
	}
	
//	public static void main(String[] args)
//	{
//		FTPHandler tmp = FTPHandler.getInstance();
//		
//		try
//		{
//			System.out.println(IOUtils.toString(tmp.getInputStream("11", "jQuery_Backup.txt")));
//		}
//		catch (IOException e)
//		{
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}
}

配置文件 

 ################################################

#Connection Configuration

ftp.server=IP地址

ftp.controlkeepalivetimeout=300

#Account Configuration

ftp.11_username=123

ftp.11_password=123

ftp.33_username=456

ftp.33_password=456

    

    

猜你喜欢

转载自yangsj19870829.iteye.com/blog/1962602