分享
 
 
 

Jakarta Commons - Net Class Library介绍(FTP部分)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

reference:http://www.informit.com/guides/content.asp?g=java&seqNum=40

尽管jakarta apache组织发布了大量的开放源码的项目,但是最受欢迎、应用最广泛的恐怕要数Tomcat Servlet engine了。如果你曾经实施过类似FTP,Telnet,SMTP,pop3和NNTP这些互联网协议的话,你就会知道检查这些协议具体实施中的错误是何等的困难。不过现在你不用担心这个问题了,apache组织推出的Commons/Nets库使我们从这些协议的具体实施中脱离出来,我们再也不需要绞尽脑汁为实现某个协议而彻夜不眠了。Commons/Nets库包括下面几种协议:

Finger

Whois

TFTP

Telnet

Pop3

FTP

NNTP

SMTP

还有其它一些像Time和Echo这样的协议。

Commons/Net库的目标就是为程序员提供一个通用、跨平台并易于使用的互联网协议族。如果您非常熟悉这些协议,那么您的知识将非常有助于您对Commons/Net库中一系列API的理解,如果您不是很了解这些协议的话,没关系,这些API将有助于您对协议的了解。

下面分别介绍如何使用Commons/Net库中的API来实现我们所要的功能。首先介绍FTP(File Transfer Protocol)协议

File Transfer Protocol

分布式系统中,从一台机器向另一台机器传输文件是一项非常常见的任务。我们经常使用FTP工具连接到一台远程服务器上,找到所要的文件并下载到本地机器上。一个FTP会话过程如下所示

C:\> ftp 192.168.1.99

Connected to 192.168.1.99.

220 WGB01 FTP server (Version wu-2.6.2-5) ready.

User (192.168.1.99:(none)): myusername

331 Password required for myusername.

Password:

230 User myusername logged in.

ftp> cd /apps/mydir

ftp> ls

200 PORT command successful.

150 Opening ASCII mode data connection for directory listing.

total 6160

-rw-r--r-- 1 501 100 3147032 Mar 31 13:37 myfile.pdf

226 Transfer complete.

ftp: 101 bytes received in 0.58Seconds 0.17Kbytes/sec.

ftp> lcd c:\download

ftp> bin

ftp> get myfile.pdf

大致经历了下面几个步骤:

1. 连接服务器

2. 输入用户名、密码登录

3. 改变访问文件夹"/apps/mydir" (cd)

4. 获得文件列表

5. 改变本地文件夹路径

6. 设定传输模式为binary

7. 下载myfile.pdf文件

上面的每一个步骤都需要FTP 客户端和FTP服务器端的相互交互,每个步骤都需要进行错误检查。

下面是一段使用Commons/Net库,利用FTP协议从服务器下载文件的代码

import org.apache.commons.net.ftp.*;

public static void getDataFiles( String server,String username,String password,

String folder,String destinationFolder,Calendar start,Calendar end )

{

try

{

// Connect and logon to FTP Server

FTPClient ftp = new FTPClient();//FTPClient对象拥有客户端的各种方法

ftp.connect( server );

ftp.login( username, password );

System.out.println("Connected to " + server + ".");

System.out.print(ftp.getReplyString());

// List the files in the directory

ftp.changeWorkingDirectory( folder );

FTPFile[] files = ftp.listFiles();

System.out.println( "Number of files in dir: " + files.length );

DateFormat df = DateFormat.getDateInstance( DateFormat.SHORT );

for( int i=0; i<files.length; i++ )

{

Date fileDate = files[ i ].getTimestamp().getTime();

if( fileDate.compareTo( start.getTime() ) >= 0 &&

fileDate.compareTo( end.getTime() ) <= 0 )//比较文件创建时间是否符合要求

{

// Download a file from the FTP Server

System.out.print( df.format( files[ i ].getTimestamp().getTime() ) );

System.out.println( "\t" + files[ i ].getName() );

File file = new File( destinationFolder + File.separator + files[ i ].getName() );

FileOutputStream fos = new FileOutputStream( file );

ftp.retrieveFile( files[ i ].getName(), fos );

fos.close();

file.setLastModified( fileDate.getTime() );

}

}

// Logout from the FTP Server and disconnect

ftp.logout();

ftp.disconnect();

}

catch( Exception e )

{

e.printStackTrace();

}

}

为了使上面的代码能够顺利编译执行,首先在http://jakarta.apache.org/commons/net/index.html下载Commons/Net库,然后将系统的CLASSPATH指向下载的common-net-1.0.0jar文件。

在getDataFiles()方法中,首先程序运用预先设定的用户名和密码连接一个FTP服务器,然后改变路径到特定的目录,将文件下载到特定的本地目录中。所有这些操作通过两个Commons/Net类来完成:

l FTPClient:用来连接、登录服务器,导航目录结构,获得文件列表,上传、下载文件,退出,关闭连接。

l FTPFile:用来获得文件属性。

FTPClient提供了下面方法用于与服务器的交互:

l Connect(String server) 连接服务器

l Disconnect() 关闭连接

l Login(String username,String password) 登录FTP服务器

l Logout() 退出FTP服务器

l ChangeWorkingDirectiory(String pathname) 改变当前在Ftp 服务器上的工作目录

l FTPFile[] listFiles() 获得当前FTP服务器工作目录中的文件列表

l String[] listNames() 获得当前FTP服务器工作目录中文件的名子

l Rename(String from ,String to),重命名FTP服务器工作目录中的文件名称

l StoreFile(String remoteName,InputStream local),上传本地文件到服务器当前工作目录上

l RetrieveFile(java.lang.String remoteName,OutputStream local) 下载FTP服务器工作目录中的文件到本地

FTPFile类提供了下面功能:

l String getName() 获得文件名

l String getGroup() 获得这个文件所属的group

l String getUser() 获得文件所有者名称

l Long getSize() 获得文件的大小

l Int getType 获得文件的类型:DIRECTORY_TYPE,FILE_TYPE,SYMBOLIC_LINK_TYPE,UNKNOWN_TYPE

l Boolean isDirectory() 是否是文件夹

l Boolean isFile() 是否是文件(不是文件夹)

l Boolean isSymbolicLink() 如果是symbolic链接,返回true

l Calendar getTimestamp 获得文件上次修改的具体时间

在上面提到的函数中,仅仅用几行代码就完成了大量的任务。因此,显而易见,运用Commons/Net库,可以使开发人员从繁琐的协议实施中脱身出来,将精力几种在具体业务细节的开发上来。

接下来将介绍TELNET等协议。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有