在www.enterprisedt.com上可以获得.
看了看源码,没算测试类,总共才17个类和接口.
所以就简单的看了看.
FTPException ----此类为FTP的异常处理类,继承了Exception,没有什么内容,都交给超类来处理了
还加了个响应码(replyCode)
FTPTransferType ----此类封装了传输文件的类型.现在这个类库只支持两种类型,一个是ASCII和
Image(常称为BINARY),在源码文件包中的doc目录中有一个RFC959的文件,它
是较早的FTP参考规范,其中指定了5种数据类型,ASCII,EBCDIC,IMAGE,LOCAL和
FORMAT.在此类中还实现了Type命令,需要为ASCII和Image类型指定不同的字符.
FTPReply ----此类封装了服务器返回的响应信息.响应信息在此类中分为两种,一种为响应码(replyCode)
另一种为响应文本(或者是响应内容)(replyText).可以看FTP规范种的响应码和
响应文本的详细定义.
FTPConnectMode ----此类封装了用FTP进行连接的模式.有两种模式,主动(Active)和被动(Passive)模式.
主动模式就是客户端提供一个端口,来让服务器进行连接.而被动模式就是服务器自动
生成一个随即的端口,来供客户端进行连接.
FTPDataSocket ----此为接口,主动连接和被动连接都实现此接口.另外此接口定义了一个超时的设置.
FTPActiveDataSocket ----此类为主动连接模式,实现了FTPDataSocket接口.封装了基本的Socket类.
FTPPassiveDataSocket----此类为被动连接模式,实现了FTPDataSocket接口.封装了基本的Socket类.
FTPControlSocket ----此类实现了服务器和客户端之间连接的控制.
createDataSocket方法用来创建主动或者是被动连接的通道.
1 | if(connectMode == FTPConnectMode.ACTIVE) return createDataSocketActive(); else return createDataSocketPASV(); |
sendCommand方法利用类中的输出成员来发送命令.
readReply方法利用类中的输入成员来处理响应.在RFC959中,如果信息只有一行的话,
其格式为:"响应码+空格+响应文本",而如果有多行的话,其格式为:"响应码+'-'+若干
行+最后一行(首行响应码+空格+最后信息)".该方法处理多行信息时用空格替换了回车
1 | reply.append(" ").append(line); |
FTPClient ----此类有两个主要成员,进行控制的FTPControlSocket类和进行数据传输的FTPDataSocket
包含了一些状态成员,有连接模式,传输模式,超时时间等.
包含了监视相关成员,监视器,监视区间(以字节表示).监视器为此类库中的FTPProgressMonitor接口
在此类库中没有对此接口的实现,需要自己实现.它定义的目的为监视传输过程,就是当你每传输
一定量的字节后,可以调用接口中的方法来做一些特定的操作.
FTPClient的主要功能就是进行上传和下载的操作.有多个重载的上传(put)和下载(get)的方法.
上传文件时,可以指定是否是接在原文件的后面还是覆盖此文件.然后根据连接类型来选择不同的连接
模式.
还有一些类为文件类型的类和一些消息控制和响应的类.
再来看看如何来简单使用这个类库
直接给出代码:
1 | String host = "ftp.xxx.com"; int port = 21; String user = "dorian"; String password = "dorian"; String remoteFile = "readme.txt"; String localPath = "c:/temp/"; FtpClient client = new FtpClient(host,port); client.login(user,psw); client.get(localPath,remoteFile); client.quit(); |
如你所看到的取一个文件就是那么简单^_^
这是它自带的一个Demo,可以看到另一些用法.
1 | import com.enterprisedt.net.ftp.FTPClient; import com.enterprisedt.net.ftp.FTPMessageCollector; import com.enterprisedt.net.ftp.FTPTransferType; import com.enterprisedt.net.ftp.FTPConnectMode; import com.enterprisedt.util.debug.Level; import com.enterprisedt.util.debug.Logger; public class Demo { /** * Log stream */ private static Logger log = Logger.getLogger(Demo.class); public static void main(String[] args) { // we want remote host, user name and password if (args.length < 3) { usage(); System.exit(1); } // assign args to make it clear String host = args[0]; String user = args[1]; String password = args[2]; Logger.setLevel(Level.ALL); FTPClient ftp = null; try { // set up client log.info("Connecting"); ftp = new FTPClient(host); FTPMessageCollector listener = new FTPMessageCollector(); ftp.setMessageListener(listener); // login log.info("Logging in"); ftp.login(user, password); // set up passive ASCII transfers log.debug("Setting up passive, ASCII transfers"); ftp.setConnectMode(FTPConnectMode.PASV); ftp.setType(FTPTransferType.ASCII); // get directory and print it to console log.debug("Directory before put:"); String[] files = ftp.dir(".", true); for (int i = 0; i < files.length; i++) log.debug(files[i]); // copy file to server log.info("Putting file"); ftp.put("test.txt", "test.txt"); // get directory and print it to console log.debug("Directory after put"); files = ftp.dir(".", true); for (int i = 0; i < files.length; i++) log.debug(files[i]); // copy file from server log.info("Getting file"); ftp.get("test.txt" + ".copy", "test.txt"); // delete file from server log.info("Deleting file"); ftp.delete("test.txt"); // get directory and print it to console log.debug("Directory after delete"); files = ftp.dir("", true); for (int i = 0; i < files.length; i++) log.debug(files[i]); // Shut down client log.info("Quitting client"); ftp.quit(); String messages = listener.getLog(); log.debug("Listener log:"); log.debug(messages); log.info("Test complete"); } catch (Exception e) { e.printStackTrace(); } } public static void usage() { System.out.println("Usage: Demo remotehost user password"); } } |
此网站还有一个edtFTPSSL的类库,我还没看,看这个名字估计是安全方面的.
当然你还可以在此网站看到一个.Net实现的类库.