最近用到FTP相关的操作,因为有伟大开源社区的存在,也不用自己再实现一把FTP协议了,看了下常用的FTP软件包,主要有Apache和Commons net中的Commons FTP和JDK中的自带的ftp操作类,看了下网友们写的例子,对比了一下。虽然我也不想每一个项目都依赖一堆外部JAR包,但还是选择采用Commons FTP,主要原因就是JDK中自带的是sun的内部包,并没有公开,并不能保证以后版本中能用。为方便使用,由于需要的功能也比较简单,也就做了下简单的封装。代码如下:
package org.migle.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
/**
* FTP Client工具类,封装了<a href="http://commons.apache.org/net/">Jakarta Commons Net
* FTPClient</a>对常用的功能如上传、下载 等功能提供简易操作,如果需要Jakarta Commons Net
* FTPClient的全部功能可以通过{@link #getFtpclient()}
* 得到org.apache.commons.net.ftp.FTPClient
* 对象,对于org.apache.commons.net.ftp.FTPClient的全部功能有请查看 <a href =
* "http://commons.apache.org/net/api/org/apache/commons/net/ftp/FTPClient.html"
* > FTPClient API </a>
*
* @since V2.0
* @version V1.0 2010-2-26
* @author 研发中心
*/
public class FTPClientUtil {
private static Log logger = LogFactory.getLog(FTPClient.class);
private FTPClient ftpclient;
public FTPClientUtil(String host, int port) throws Exception {
this(host, port, null, null);
}
public FTPClientUtil(String host, int port, String username, String password)
throws Exception {
ftpclient = new FTPClient();
try {
ftpclient.connect(host, port);
int reply = ftpclient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpclient.disconnect();
logger.fatal("FTP服务器拒绝连接");
throw new Exception("FTP服务器拒绝连接");
}
if (username != null) {
if (!ftpclient.login(username, password)) {
ftpclient.disconnect();
logger.fatal("登陆验证失败,请检查账号和密码是否正确");
throw new Exception("登陆验证失败,请检查账号和密码是否正确");
}
}
} catch (SocketException e) {
logger.fatal("无法连接至指定FTP服务器", e);
throw new Exception(e);
} catch (IOException e) {
logger.fatal("无法用指定用户名和密码连接至指定FTP服务器", e);
throw new Exception(e);
}
}
/**
*
* @param path
* 文件在FTP上存储的绝路径
* @param input
* 上传文
* @throws IOException
*/
public boolean upload(String pathname, InputStream input)
throws IOException {
// 是否是在根目录 下
ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
if (pathname.indexOf("/") != -1) {
String path = pathname.substring(0, pathname.lastIndexOf("/"));
mkdir(path);
}
return ftpclient.storeFile(new String(pathname.getBytes(), ftpclient.getControlEncoding()), input);
}
/**
* 从FTP服务器上下载pathname指定的文件,命名为localName
*
* @param pathname
* @param localName
* @return
* @throws Exception
*/
public boolean download(String pathname, String localName) throws Exception {
String filename = localName != null ? localName : pathname
.substring(pathname.lastIndexOf("/") + 1);
if (filename == null || filename.isEmpty()) {
return false;
}
// 设置被动模式
ftpclient.enterLocalPassiveMode();
// 设置以二进制方式传输
ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
if (ftpclient.listFiles(new String(pathname.getBytes(),ftpclient.getControlEncoding())).length == 0) {
logger.fatal("下载文件不存在");
throw new Exception("下载文件不存在");
}
File tmp = new File(filename + "_tmp"); // 临时文件
File file = new File(filename);
FileOutputStream output = null;
boolean flag;
try {
output = new FileOutputStream(tmp);
flag = ftpclient.retrieveFile(new String(pathname.getBytes(),ftpclient.getControlEncoding()), output);
output.close();
if (flag) {
// 下载成功,重命名临时文件。
tmp.renameTo(file);
System.out.println(file.getAbsolutePath());
}
} catch (FileNotFoundException e) {
logger.fatal("下载文件失败", e);
throw new Exception(e);
} finally {
output.close();
}
return flag;
}
/**
* 只删除文件,如果删除空目录请用如下方法: <code>
* getFtpclient().removeDirectory(String pathname)
* </code> 参考
* {@link org.apache.commons.net.ftp.FTPClient FTPClient}
*
* @param pathname
* @return 成功删除返回true,否则返回false(如果文件不存在也返回false)
* @throws IOException
*/
public boolean delete(String pathname) throws IOException {
return ftpclient.deleteFile(new String(pathname.getBytes(),ftpclient.getControlEncoding()));
}
/**
* 改变当前目录至pathname,"/"代表根目录
*
* @param pathname
* 路径名
* @return 如果改变成功返true否则返回false
* @throws IOException
*/
public boolean changeWorkingDirectory(String pathname) throws IOException {
return ftpclient.changeWorkingDirectory(new String(pathname.getBytes(),ftpclient.getControlEncoding()));
}
/**
* @return {@link org.apache.commons.net.ftp.FTPClient FTPClient}对象
*/
public FTPClient getFtpclient() {
return this.ftpclient;
}
/**
* @param ftpclient
* {@link org.apache.commons.net.ftp.FTPClient FTPClient}对象
*/
public void setFtpclient(FTPClient ftpclient) {
this.ftpclient = ftpclient;
}
public void close() throws Exception {
ftpclient.disconnect();
}
/**
*
* @param pathname
* 要创建的目录路径,可以是相对路径,也可以是绝路径("/"开始)
* @return 如果成功创建目录返回true,否则返回false(如果目录已存在也返回false)
* @throws IOException
*/
public boolean mkdir(String pathname) throws IOException {
//ftpclient.setControlEncoding("ISO-8859-1");
//注意编码,如果不编码文件中文目录无法创建
return ftpclient.makeDirectory(new String(pathname.getBytes(),ftpclient.getControlEncoding()));
}
public static void main(String[] args) throws Exception {
// URI uri = new URI(
// "ftp://100.180.185.205/oracle_10201_database_win32/database/welcome.html");
// System.out.println(uri.toURL().getHost());
// System.out.println(uri.toURL().getPath());
// System.out.println(uri.toURL().getFile());
FTPClientUtil ftputil = new FTPClientUtil("100.180.185.205", 21, "username",
"password");
System.out.println(ftputil.mkdir("测试"));
ftputil.close();
// ftputil.upload("drop.sql", new FileInputStream("c:/drop.sql"));
// ftputil.download("/drop.sql", "drop.sql");
// FTPClient ftp = ftputil.getFtpclient();
// FTPListParseEngine engine = ftp.initiateListParsing();
// System.out.println(ftp.listFiles().length);
// while (engine.hasNext()) {
// FTPFile[] files = engine.getNext(25); // "page size" you want
// }
// FTPClient ftpclient = ftputil.getFtpclient();
//
// FTPFile[] f = ftpclient.listFiles("/kk/aa/drop2.sql");
// System.out.println(f.length);
// System.out.println(ftpclient.makeDirectory("/tt/aa/bb"));
// System.out.println(ftpclient.getReplyString());
// ftpclient.changeWorkingDirectory("/tt/aa/bb");
//
// //System.out.println(ftpclient.deleteFile("/tt/aa/cc/"));
// System.out.println(ftpclient.getReplyString());
// ftpclient.changeWorkingDirectory("/");
// System.out.println(ftpclient.listFiles().length);
// System.out.println("a".lastIndexOf("/"));
}
}
分享到:
相关推荐
《Apache Commons Net FTP库在Java开发中的应用》 Apache Commons Net是一个Java库,它提供了对各种网络协议的支持,其中就包括FTP(File Transfer Protocol)协议。在这个特定的案例中,我们关注的是`commons-...
.net.ftp.FTPClient jar ,exaple, commons-net-2.0.jar
org.apache.commons.net.ftp.FTPClient包,不错,在实际项目和产品中使用过。
在Java编程中,Apache Commons Net库提供了一系列工具类来处理各种网络协议,其中包括FTP(文件传输协议)。在本文中,我们将深入探讨如何使用`org.apache.commons.net.ftp.FTPClient`包来实现简单的文件下载功能。...
上传了收集的最新的 commons-io-2.4.jar 包 和 commons-net-3.3.jar 以及 FTP java调用例子。net 包是一个用于操作Internet基础协议(Finger,Whois,TFTP,Telnet,POP3,FTP,NNTP,以及SMTP)的底层API。Net包...
org.apache.commons.net.ftp的官方完整jar包 放心使用
Apache Commons Net库是一个Java库,专门用于处理各种网络协议,其中FTP(文件传输协议)是其核心功能之一。本帮助文档API将详细解释如何利用这个库来实现FTP相关的操作。 FTP(File Transfer Protocol)是一种标准...
FTP应用的jar包,主要用于java开发FTP上传下载
Apache Commons Net库是Java开发人员在处理网络协议时的一个强大工具,特别是对于FTP(文件传输协议)操作。标题"org.apache.commons.net.ftp"表明这个压缩包包含了与Apache Commons Net库中FTP相关的类和功能。描述...
Apache Commons Net库是Java开发人员在处理各种网络协议时常用的一个工具包,其中包括对FTP(文件传输协议)的全面支持。在3.3版本中,`org.apache.commons.net.ftp.FTPClient`类是实现FTP通信的核心组件。这个类...
Apache Commons Net是Java库,提供了对FTP协议的全面支持,使得开发者能够轻松地在Java应用程序中实现FTP功能,包括上传、下载、删除文件等操作。在这个场景中,我们将详细探讨如何使用Apache Commons Net库进行FTP...
Apache Commons Net库是Java开发人员在处理网络协议时的一个强大工具,特别是对于FTP(文件传输协议)客户端编程。这个库,如"commons-net-ftp-2.0.rar"所示,包含了一系列的JAR文件,使得开发者能够轻松地构建FTP...
本教程将深入讲解如何利用Apache Commons Net库的3.3版本在Android应用中实现FTP功能。 首先,Apache Commons Net是一个Java库,提供了一系列用于网络通信的类和实用工具,包括FTP客户端组件。在Android项目中,...
Apache Commons Net是一个强大的Java库,提供了多种网络协议的实现,包括FTP(文件传输协议)。在本文中,我们将深入探讨如何利用这个库开发一个FTP工具类,以便在Java应用程序中进行文件上传、下载和其他FTP操作。 ...
commons-net-2.0-ftp.jar
本文将详细讲解如何在Android应用中使用Apache Commons Net库进行FTP操作,并提供一个具体的`ftpDemo`示例。 Apache Commons Net是Apache软件基金会的一个开源项目,它提供了一系列用于网络编程的实用工具,其中...
根据提供的文件信息,可以看出文档的主题是关于commons-ftp库中的FTPClient类的API使用指南。commons-ftp是一个Java开源库,用于在应用程序中实现FTP协议的相关操作,如文件上传、下载、删除等。FTPClient是这个库中...
《Apache Commons Net 3.6:FTP操作与源码解析》 Apache Commons Net是一个Java库,专注于网络协议的实现,尤其是FTP(文件传输协议)相关的功能。在这个版本中,我们聚焦于`commons-net-3.6.jar`,它提供了丰富的...
Apache Commons Net库与Ftp4j是Java编程中用于FTP(文件传输协议)操作的重要工具。这两个库在处理文件上传、下载以及管理FTP服务器时扮演着关键角色。 Apache Commons Net是一个由Apache软件基金会开发的Java类库...