在《ftp上传与下载》文章中,封装一个Ftp上传下载的工具类,主要代码如下:
上传:
/**上传文件 * @param remoteFileName 远程文件名称 * @param locaFileName 本地文件名称 */ public void upload(String remoteFileName,String locaFileName){ FTPClient ftp=null; try { ftp = new FTPClient(); ftp.addProtocolCommandListener( new PrintCommandListener( new PrintWriter( System.out ), true ) ); //连接ftp服务器 connect( ftp ); //设置属性 setProperty( ftp ); //上传文件 upload( ftp, remoteFileName, locaFileName ); //退出 logout( ftp ); } catch (Exception e) { e.printStackTrace(); }finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException f) { } } } }
下载:
/**下载文件 * @param remoteFileName 远程文件名称 * @param locaFileName 本地文件名称 */ public void download(String remoteFileName,String locaFileName){ FTPClient ftp=null; try { ftp = new FTPClient(); ftp.addProtocolCommandListener( new PrintCommandListener( new PrintWriter( System.out ), true ) ); //连接ftp服务器 connect( ftp ); //设置属性 setProperty( ftp ); //下载文件 download( ftp, remoteFileName, locaFileName ); //退出 logout( ftp ); } catch (Exception e) { e.printStackTrace(); }finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException f) { } } } }
从上面两个方法来看,我们发现upload()与download()方法的,有公共的操作流程:
connect()
setProperty()
具体操作方法
logout( )
这时,可以使用模板模式对它进行重构,不了解模板模式的朋友,可以参考《行为模式之Template(模板模式)》
定义一个模板方法,来完成操作流程的调用,在上篇模版模式当中,是以继承的方式,由子类来实现具体的操作方法,
这次将以聚合的方式实现.
首先,将具体操作方法定义在接口中,接口定义如下:
FtpInvoke
package com.demo.ftp; import org.apache.commons.net.ftp.FTPClient; /**ftp操作 * @author wobendiankun *2015-1-22 下午08:27:12 */ public interface FtpInvoke { /** * @param ftp * @param remoteFileName * @param locaFileName */ void doHandle(FTPClient ftp ,String remoteFileName, String locaFileName) throws Exception; }
其次,引入一个新的模版类,名为FtpTemplate,定义一个模板方法handle(),如下:
private void handle(FtpInvoke ftpInvoke, String remoteFileName, String locaFileName) { FTPClient ftp = null; try { ftp = new FTPClient(); ftp.addProtocolCommandListener(new PrintCommandListener( new PrintWriter(System.out), true)); // 连接ftp服务器 connect(ftp); // 设置属性 setProperty(ftp); // 具体操作方法 ftpInvoke.doHandle(ftp, remoteFileName, locaFileName); // 退出 logout(ftp); } catch (Exception e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException f) { } } } }
接着,修改相关的操作方法,upload()及download()方法,利用一个匿名类,让handle()方法来回调
/** * 上传文件 * * @param remoteFileName * 远程文件名称 * @param locaFileName * 本地文件名称 */ public void upload(String remoteFileName, String locaFileName) { handle(new FtpInvoke() { @Override public void doHandle(FTPClient ftp, String remoteFileName, String locaFileName) throws Exception { //上传文件 upload( ftp, remoteFileName, locaFileName ); } }, remoteFileName, locaFileName); }
/** * 下载文件 * * @param remoteFileName * 远程文件名称 * @param locaFileName * 本地文件名称 */ public void download(String remoteFileName, String locaFileName) { handle(new FtpInvoke() { @Override public void doHandle(FTPClient ftp, String remoteFileName, String locaFileName) throws Exception { // 下载文件 download(ftp, remoteFileName, locaFileName); } }, remoteFileName, locaFileName); }
最后要让FtpClientUtil聚合FtpTemplate,然后将对应的请求委托给FtpTemplate来处理就可以了,大功告成.
package com.demo.ftp; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ConnectException; import org.apache.commons.net.PrintCommandListener; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; /** * @author wobendiankun 2015-1-8 下午08:11:08 */ public class FtpClientUtil { FtpTemplate fpFtpTemplate ; public FtpClientUtil () { String server = "localhost"; int port = 21; String username = "kun"; String password = "111111"; fpFtpTemplate = new FtpTemplate(server, port, username, password); } public FtpClientUtil(String server, int port, String username, String password) { fpFtpTemplate = new FtpTemplate(server, port, username, password); } /**上传文件 * @param remoteFileName 远程文件名称 * @param locaFileName 本地文件名称 */ public void upload(String remoteFileName,String locaFileName){ fpFtpTemplate.upload(remoteFileName, locaFileName); } /**下载文件 * @param remoteFileName 远程文件名称 * @param locaFileName 本地文件名称 */ public void download(String remoteFileName,String locaFileName){ fpFtpTemplate.download(remoteFileName, locaFileName); } /**创建文件夹 * @param remotePathName 远程文件夹名称 */ public void mkdir(String remotePathName) { fpFtpTemplate.mkdir(remotePathName); } }FtpInvoke:
package com.demo.ftp; import org.apache.commons.net.ftp.FTPClient; /**ftp操作 * @author wobendiankun *2015-1-22 下午08:27:12 */ public interface FtpInvoke { /** * @param ftp * @param remoteFileName * @param locaFileName */ void doHandle(FTPClient ftp ,String remoteFileName, String locaFileName) throws Exception; }
FtpTemplate
package com.demo.ftp; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ConnectException; import org.apache.commons.net.PrintCommandListener; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; /** * @author wobendiankun 2015-1-22 下午08:27:46 */ public class FtpTemplate { /** * ftp服务器地址 */ private String server; /** * 端口 */ private int port; /** * 用户名 */ private String username; /** * 密码 */ private String password; public FtpTemplate(String server, int port, String username, String password) { this.server = server; this.port = port; this.username = username; this.password = password; } /** * @param ftp */ private void connect(FTPClient ftp) throws Exception { // 连接服务器 ftp.connect(server, port); int reply = ftp.getReplyCode(); // 是否连接成功 if (!FTPReply.isPositiveCompletion(reply)) { throw new ConnectException(server + " 服务器拒绝连接"); } // 登陆 if (!ftp.login(username, password)) { throw new ConnectException("用户名或密码错误"); } } /** * @param ftp * @throws Exception */ private void setProperty(FTPClient ftp) throws Exception { ftp.enterLocalPassiveMode(); // 二进制传输,默认为ASCII ftp.setFileType(FTP.BINARY_FILE_TYPE); } /** * @param ftp */ private void logout(FTPClient ftp) throws Exception { ftp.noop(); ftp.logout(); } /** * @param ftp * @param remoteFileName * @param locaFileName */ private void upload(FTPClient ftp, String remoteFileName, String locaFileName) throws Exception{ //上传 InputStream input; input = new FileInputStream(locaFileName); ftp.storeFile(remoteFileName, input); input.close(); } /** * @param ftp * @param remoteFileName * @param locaFileName */ private void download(FTPClient ftp, String remoteFileName, String locaFileName) throws Exception { OutputStream output = null; output = new FileOutputStream(locaFileName); ftp.retrieveFile(remoteFileName, output); output.close(); } /** * @param ftp * @param remotePathName */ private void mkdir(FTPClient ftp, String remotePathName) throws Exception{ ftp.makeDirectory(remotePathName); } private void handle(FtpInvoke ftpInvoke, String remoteFileName, String locaFileName) { FTPClient ftp = null; try { ftp = new FTPClient(); ftp.addProtocolCommandListener(new PrintCommandListener( new PrintWriter(System.out), true)); // 连接ftp服务器 connect(ftp); // 设置属性 setProperty(ftp); // 具体操作方法 ftpInvoke.doHandle(ftp, remoteFileName, locaFileName); // 退出 logout(ftp); } catch (Exception e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException f) { } } } } /** * 上传文件 * * @param remoteFileName * 远程文件名称 * @param locaFileName * 本地文件名称 */ public void upload(String remoteFileName, String locaFileName) { handle(new FtpInvoke() { @Override public void doHandle(FTPClient ftp, String remoteFileName, String locaFileName) throws Exception { //上传文件 upload( ftp, remoteFileName, locaFileName ); } }, remoteFileName, locaFileName); } /** * 下载文件 * * @param remoteFileName * 远程文件名称 * @param locaFileName * 本地文件名称 */ public void download(String remoteFileName, String locaFileName) { handle(new FtpInvoke() { @Override public void doHandle(FTPClient ftp, String remoteFileName, String locaFileName) throws Exception { // 下载文件 download(ftp, remoteFileName, locaFileName); } }, remoteFileName, locaFileName); } /**创建文件夹 * @param remotePathName 远程文件夹名称 */ public void mkdir(String remotePathName) { handle(new FtpInvoke() { @Override public void doHandle(FTPClient ftp, String remoteFileName, String locaFileName) throws Exception { //创建文件夹 mkdir( ftp, remoteFileName); } }, remotePathName, null); } }
时间: 2024-10-01 05:39:45