首先来个FtpInfo类
package org.javawo.components.ftp;
/**
* FTP连接参数VO类
*
* @author 杨涛
*
*/
public class FtpInfo {
/** 登录用户名*/
private String name;
/** 登录密码*/
private String password;
/** 登录IP地址*/
private String ip;
/** 登录端口*/
private int port;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
}
其次再来Ftp的实际操作类:
package org.javawo.components.ftp;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
/**
*
* FTP消费类,提供一系列的FTP操作方法
*
* @author 杨涛
*
*/
public class FtpUtil {
/** 登录用户名,密码,IP等参数*/
private String name,password,ip;
/** 登录端口*/
private int port;
/** FTP操作对象*/
private FTPClient ftpClient = null;
/** 构造方法,初始化传入要连接的FTP参数信息*/
public FtpUtil(FtpInfo ftpInfo) throws Exception {
if(ftpInfo==null) {
/** 判断如果为null 就抛出初始化异常*/
throw new Exception("传递的FTP连接参数对象是null");
} else {
this.init(ftpInfo);
}
}
/**
* 下载文件到本地
*
* @param remoteFileName
* @param localFileName
*/
public void loadFile(String remoteFileName, String localFileName) {
BufferedOutputStream buffOut = null;
try {
buffOut = new BufferedOutputStream(new FileOutputStream(localFileName));
/** 写入本地文件*/
ftpClient.retrieveFile(remoteFileName, buffOut);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (buffOut != null)
buffOut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 上传文件到FTP服务器上
*
* @param localFileStream
* @param fileName
* @return
* @throws IOException
*/
public boolean uploadFile(InputStream localFileStream, String fileName) throws IOException {
/** 返回参数*/
boolean fla = false;
try{
/** 设置文件类型*/
ftpClient.setFileType();
/** 上传之前先给文件命明为.TMP*/
String tempName = fileName+".tmp";
/** 开始上传文件*/
ftpClient.storeFile(tempName, localFileStream);
/** 上传完毕之后再该为原名*/
renameFile(tempName,fileName);
fla = true;
}catch(Exception ex){
ex.printStackTrace();
}finally {
localFileStream.close();
}
return fla;
}
/**
* 下载文件流
*
* @param remoteFileName
* @param output
* @return
*/
public boolean downloadFile(String remoteFileName, OutputStream output) throws IOException{
try {
if ((remoteFileName!=null)&&(output!=null)) {
ftpClient.setFileType();
boolean ret = ftpClient.retrieveFile(remoteFileName, output);
return ret;
} else {
return false;
}
}catch (IOException e) {
if (e.getMessage()=="IOException caught while copying." || output==null) {
ftpClient.disconnect();
}
return false;
}
}
/**
* 重命名FTP上的文件
*
* @param oldName
* @param newName
*/
public void renameFile(String oldName,String newName) {
try{
/** 重命名*/
ftpClient.rename(oldName, newName);
}catch(Exception ex){
ex.printStackTrace();
}
}
/**
* 获取服务器上的文件大小
*
* @param fileName
* @return
*/
public long getFileSize(String fileName) {
try {
StringBuffer command = new StringBuffer("size ");
command.append(fileName);
ftpClient.sendCommand(command.toString());
if (ftpClient.getReplyCode()==213)
{
String replyText=ftpClient.getReplyString().substring(4).trim();
return Long.parseLong(replyText);
}else{
return 0;
}
} catch (Throwable e) {
e.printStackTrace();
return 0;
}
}
/**
* 初始化FTP连接参数
*
* @param ftpInfo
*/
public void init(FtpInfo ftpInfo) {
this.name = ftpInfo.getName();
this.password = ftpInfo.getPassword();
this.ip = ftpInfo.getIp();
this.port = ftpInfo.getPort();
}
/**
* 连接到FTP服务器
*
*/
public void connectServer() {
/** 如果当前ftpClient对象是null且没有连接就连接到FTP服务器*/
if(this.ftpClient==null && !this.ftpClient.isConnected()) {
try {
/** 如果ftpClient对象为null就实例化一个新的*/
this.ftpClient = new FTPClient();
this.ftpClient.setDefaultPort(this.port); /** 设置默认的IP地址*/
this.ftpClient.connect(this.ip);/** 连接到FTP服务器*/
/** 登录到这台FTP服务器*/
if(ftpClient.login(this.name, this.password)){
System.out.println("在类FtpUtil中: 服务器"+this.ip+"的用户"+this.name+"登录成功!");
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
/**
* 销毁FTP服务器连接
*
*/
public void closeConnect() {
/** 判断当前ftpClient对象不为null和FTP已经被连接就关闭*/
if (this.ftpClient != null && this.ftpClient.isConnected()) {
try{
this.ftpClient.disconnect();/** 销毁FTP连接*/
}catch(Exception ex){
ex.printStackTrace();
}
}
}
}
在来Ftp的Map连接池
package org.javawo.components.ftp;
import java.util.HashMap;
/**
* 定义一个HashMap,装载FTP连接的实例化对象,这里做FTP的连接池使用
*
* @author 杨涛
*
*/
public class FtpConnectMap {
/** K-V对应的连接池*/
@SuppressWarnings("unchecked")
private static HashMap connectMap = new HashMap();
private static FtpConnectMap ftpMap = null;
/**
* 获得FtpConnectMap的实例化对象
*
* @return
*/
public static FtpConnectMap getInstance() {
if(ftpMap==null){
ftpMap = new FtpConnectMap();
}
return ftpMap;
}
/**
* 通过Name获取存在HashMap中的FTP连接对象
*
* @param name
* @return
*/
public FtpUtil getFtpUtil(String name) {
FtpUtil ftpUtil = (FtpUtil)connectMap.get(name);
return ftpUtil;
}
/**
* 给HashMap添加一个新的FTP连接对象
*
* @param name
* @param ftpUtil
*/
@SuppressWarnings("unchecked")
public void addFtpUtil(String name,FtpUtil ftpUtil) {
connectMap.put(name, ftpUtil);
}
}
最后再来一个是Ftp的创建工厂
package org.javawo.components.ftp;
/**
* FTP操作工厂类,负责FTP的实例创建和其他
*
* @author 杨涛
*
*/
public class FtpFactory {
/**
* 创建一个FtpUtil的实例化对象
*
* @param ftpInfo
* @return
*/
public FtpUtil createFtpUtil(FtpInfo ftpInfo){
/** 获取存储对象的实例*/
FtpConnectMap ftpMap = FtpConnectMap.getInstance();
/** 从HashMap中获取一个连接的实例化对象*/
FtpUtil ftpUtil = ftpMap.getFtpUtil(ftpInfo.getName());
if(ftpUtil==null) {
try{
/** 该连接不存在于HashMap中,实例化一个连接将此连接添加到HashMap中*/
ftpUtil = new FtpUtil(ftpInfo);/** 实例化一个FTP连接*/
ftpUtil.connectServer();
ftpMap.addFtpUtil(ftpInfo.getName(),ftpUtil);
}catch(Exception ex){
ex.printStackTrace();
}
}
return ftpUtil;
}
}