Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90862
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1007
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 14:50
文章分类

全部博文(81)

文章存档

2014年(21)

2013年(60)

我的朋友

分类: Java

2013-12-23 14:59:49

  1、sun.net.ftp.*;

  这是一个不被官方支持的,但是放在JDK下面的FTP包。正因为不被支

  持,所以没有官方提供API,这是其最大的缺陷之一。最重要由于不是官方支持的,

  所以文档也是没有的

  [url][/url]

  这里有该包的API。

  先给一个简单的例子:(例子来源互联网)

  1)显示FTP服务器上的文件

  void ftpList_actionPerformed(ActionEvent e) {

  String server=serverEdit.getText();//输入的FTP服务器的IP地址

  String user=userEdit.getText(); file://登/录FTP服务器的用户名

  String password=passwordEdit.getText();//登录FTP服务器的用户名的口令

  String path=pathEdit.getText(sdudd1223);//FTP服务器上的路径

  try {

  FtpClient ftpClient=new FtpClient();//创建FtpClient对象

  ftpClient.openServer(server);//连接FTP服务器

  ftpClient.login(user, password);//登录FTP服务器

  if (path.length()!=0) ftpClient.cd(path);

  TelnetInputStream is=ftpClient.list();

  int c;

  while ((c=is.read())!=-1) {

  System.out.print((char) c);}

  is.close();

  ftpClient.closeServer();//退出FTP服务器

  } catch (IOException ex) {;}

  }

  2)从FTP服务器上下传一个文件

  void getButton_actionPerformed(ActionEvent e) {

  String server=serverEdit.getText();

  String user=userEdit.getText();

  String password=passwordEdit.getText();

  String path=pathEdit.getText();

  String filename=filenameEdit.getText();

  try {

  FtpClient ftpClient=new FtpClient();

  ftpClient.openServer(server);

  ftpClient.login(user, password);

  if (path.length()!=0) ftpClient.cd(path);

  ftpClient.binary();

  TelnetInputStream is=ftpClient.get(filename);

  File file_out=new File(filename);

  FileOutputStream os=new

  FileOutputStream(file_out);

  byte[] bytes=new byte[1024];

  int c;

  while ((c=is.read(bytes))!=-1) {

  os.write(bytes,0,c);

  }

  is.close();

  os.close();

  ftpClient.closeServer();

  } catch (IOException ex) {;}

  }

  3)向FTP服务器上上传一个文件

  void putButton_actionPerformed(ActionEvent e) {

  String server=serverEdit.getText();

  String user=userEdit.getText();

  String password=passwordEdit.getText();

  String path=pathEdit.getText();

  String filename=filenameEdit.getText();

  try {

  FtpClient ftpClient=new FtpClient();

  ftpClient.openServer(server);

  ftpClient.login(user, password);

  if (path.length()!=0) ftpClient.cd(path);

  ftpClient.binary();

  TelnetOutputStream os=ftpClient.put(filename);

  File file_in=new File(filename);

  FileInputStream is=new FileInputStream(file_in);

  byte[] bytes=new byte[1024];

  int c;

  while ((c=is.read(bytes))!=-1){

  os.write(bytes,0,c);}

  is.close();

  os.close();

  ftpClient.closeServer();

  } catch (IOException ex) {;}

  }

  }

  看了这个例子,应该就能用他写东西了。

  这个包缺点很多,首先就是不被支持也不被官方推荐使用

  其次是这个包功能过于简单,简单到无法区分FTP服务器上的File是文件还是目录,有人说

  通过返回的字符串来判断,但是据说FTP在不同系统下返回的东西不大一样,所以如果通过

  判断字符串会有不好移植的问题。

  自己想出了一个办法,通过FtpClient中的cd方法来判断

  ,代码如下:

  try{

  ftp.cd(file);//file为当前判断的文件

  //如果过了说明file是目录

  }

  catch(IOException e){

  //说明file是文件

  }

  finally{

  ftp.cd("..");//返回上级目录继续判断下一文件

  }

  我用这种方法做过尝试,结果是只能判断正确一部分,有些目录仍会被认做文件,不知道

  是我的方法有错还是别的什么原因。

  如果对FTP服务没有过高的要求,使用这个包还是不错的,因为他本身就包含在JDK中,不

  存在CLASSPATH的问题,不需要导入外部包,较为方便。

  2、org.apache.commons.net.ftp.*;

  这个包在Jakarta Commons Net library里,现在的最高版本是1.4.1,可以从以下地址

  下载

  [url][/url]

  .1.zip

  里面包含了打包好的jar,API,及全部的class文件

  [url][/url]

  -src.zip

  这里包含一些例子以及全部的代码

  给出一个该包的例子:

  ...

  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();

  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

  {

  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();

  }

  }

  同sun.net.ftp相同,都是先建立FtpClient(注意两包的大小写不同)的实例,然后通过

  connect()方法连接,login()方法登陆,但是org.apache.commons.net.ftp.*明显比sun.

  net.ftp功能强大很多。

  org.apache.commons.net.ftp.*包将FTP中的file单独出来成为了一个新类FTPFile,还有

  类FTPFileEntryParser、parse,没有仔细研究,但是从字面来看应该是转化为某种形势的

  类,有待研究

  同时这个commons-net-1.4.1.jar包中也提供了FTP服务器,telnet,mail等一系列类库。

  org.apache.commons.net.ftp.*包的缺点在于需要设置classpath,并且需要下载jakarta

  -oro-2.0.8.jar这个包才能运行(如果没有这个包,会在ftp.listFiles()方法后抛出找不

  到class异常),此包无须在代码中import,只需设置在classpath中即可。下载地址:

  [url][/url]

  如果想要强大的FTP服务,那么org.apache.commons.net.ftp.*包应该是你的最好选择,而

  且也是开源,免费的。

  这个包的问题是:

  使用Jakarta Commons Net library需要在环境变量里面编辑classpath.

  这是不方便的地方。

  另外IBM也有提供一个ftp包。大家有兴趣可以搜索一下。

阅读(519) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~