当前位置:编程学习 > JAVA >>

用java实现ftp问题

代码是:
import java.io.DataInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.FileInputStream; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import sun.net.*; 
import sun.net.ftp.FtpClient;
/** 
     * connectServer 
     * 连接ftp服务器 
     * @throws java.io.IOException 
     * @param path 文件夹,空代表根目录 
     * @param password 密码 
     * @param user    登陆用户 
     * @param server 服务器地址 
     */ 
  public void connectServer(String server, String user, String password,  String path) 
  throws IOException 
   { 
     // server:FTP服务器的IP地址;user:登录FTP服务器的用户名 
     // password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径 
      ftpClient = new FtpClient(); 
      ftpClient.openServer(server); 
      ftpClient.login(user, password); 
     //path是ftp服务下主目录的子目录 
     if (path.length() != 0)   ftpClient.cd(path); 
     //用2进制上传、下载 
      ftpClient.binary();      


/** 
     * upload 
     * 上传文件 
     * @throws java.lang.Exception 
     * @return -1 文件不存在 
     *           -2 文件内容为空 
     *           >0 成功上传,返回文件的大小 
     * @param newname 上传后的新文件名 
     * @param filename 上传的文件 
     */ 
public long upload(String filename,String newname) throws Exception 

     long result = 0; 
      TelnetOutputStream os = null; 
      FileInputStream is = null; 
     try {          
          java.io.File file_in = new java.io.File(filename); 
         if (!file_in.exists()) return -1; 
         if (file_in.length()==0) return -2; 
          os = ftpClient.put(newname); 
          result = file_in.length(); 
          is = new FileInputStream(file_in); 
         byte[] bytes = new byte[1024]; 
         int c; 
         while ((c = is.read(bytes)) != -1) { 
               os.write(bytes, 0, c); 
          } 
      } finally { 
         if (is != null) { 
              is.close(); 
          } 
         if (os != null) { 
             os.close(); 
          } 
      } 
    return result; 

/** 
     * upload 
     * @throws java.lang.Exception 
     * @return 
     * @param filename 
     */ 
public long upload(String filename) 
throws Exception 

    String newname = ""; 
    if (filename.indexOf("/")>-1) 
     { 
        newname = filename.substring(filename.lastIndexOf("/")+1); 
     }else 
     { 
        newname = filename; 
     } 
    return upload(filename,newname); 


/** 
     *   download 
     *   从ftp下载文件到本地 
     * @throws java.lang.Exception 
     * @return 
     * @param newfilename 本地生成的文件名 
     * @param filename 服务器上的文件名 
     */ 
public long download(String filename,String newfilename) 
throws Exception 
{   
    long result = 0; 
     TelnetInputStream is = null; 
     FileOutputStream os = null; 
    try 
     { 
        is = ftpClient.get(filename);        
        java.io.File outfile = new java.io.File(newfilename); 
        os = new FileOutputStream(outfile); 
       byte[] bytes = new byte[1024]; 
       int c; 
       while ((c = is.read(bytes)) != -1) { 
            os.write(bytes, 0, c); 
            result = result + c; 
        } 
     } catch (IOException e) 
     { 
        e.printStackTrace(); 
     } 
    finally { 
         if (is != null) { 
              is.close(); 
          } 
         if (os != null) { 
             os.close(); 
          } 
      } 
     return result; 

/** 
   * 取得某个目录下的所有文件列表 
   * 
   */ 
public List getFileList(String path) 

     List list = new ArrayList(); 
    try 
     { 
        DataInputStream dis = new   DataInputStream(ftpClient.nameList(path)); 
       String filename = ""; 
       while((filename=dis.readLine())!=null)   
        {   
          list.add(filename);         
        }   
    
     } catch (Exception e) 
     { 
        e.printStackTrace(); 
     } 
    return list; 


/** 
     * closeServer 
     * 断开与ftp服务器的链接 
     * @throws java.io.IOException 
     */ 
public void closeServer() 
throws IOException 
{    
   try 
    { 
      if (ftpClient != null) 
       { 
         ftpClient.closeServer();      
       } 
    } catch (IOException e) { 
       e.printStackTrace(); 
    } 

   
  public static void main(String [] args) throws Exception 
   { 
     FtpUtil ftp = new FtpUtil(); 
    try { 
         //连接ftp服务器 
          ftp.connectServer("10.163.7.15", "cxl", "1", "info2"); 
         /**   上传文件到 info2 文件夹下 */ 
          System.out.println("filesize:"+ftp.upload("f:/download/Install.exe")+"字节"); 
         /** 取得info2文件夹下的所有文件列表,并下载到 E盘下 */ 
          List list = ftp.getFileList("."); 
         for (int i=0;i<list.size();i++) 
          { 
            String filename = (String)list.get(i); 
             System.out.println(filename); 
             ftp.download(filename,"E:/"+filename); 
          } 
     } catch (Exception e) { 
       /// 
     }finally 
     { 
        ftp.closeServer(); 
     } 
   }   
}
结果却是:需要为 class、interface 或 enum
请问是什么原因? --------------------编程问答-------------------- --------------------编程问答-------------------- 代码好像 不完整,不知道怎么看。
--------------------编程问答-------------------- --------------------编程问答-------------------- 看到了sun --------------------编程问答-------------------- 你的类少了头,class FtpUtil

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
class FtpUtil{
FtpClient ftpClient;
/** 
     * connectServer 
     * 连接ftp服务器 
     * @throws java.io.IOException 
     * @param path 文件夹,空代表根目录 
     * @param password 密码 
     * @param user    登陆用户 
     * @param server 服务器地址 
     */ 

  public void connectServer(String server, String user, String password,  String path) 
  throws IOException 
   { 
     // server:FTP服务器的IP地址;user:登录FTP服务器的用户名 
     // password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径 
      ftpClient = new FtpClient(); 
      ftpClient.openServer(server); 
      ftpClient.login(user, password); 
     //path是ftp服务下主目录的子目录 
     if (path.length() != 0)   ftpClient.cd(path); 
     //用2进制上传、下载 
      ftpClient.binary();      


/** 
     * upload 
     * 上传文件 
     * @throws java.lang.Exception 
     * @return -1 文件不存在 
     *           -2 文件内容为空 
     *           >0 成功上传,返回文件的大小 
     * @param newname 上传后的新文件名 
     * @param filename 上传的文件 
     */ 
public long upload(String filename,String newname) throws Exception 

     long result = 0; 
      TelnetOutputStream os = null; 
      FileInputStream is = null; 
     try {          
          java.io.File file_in = new java.io.File(filename); 
         if (!file_in.exists()) return -1; 
         if (file_in.length()==0) return -2; 
          os = ftpClient.put(newname); 
          result = file_in.length(); 
          is = new FileInputStream(file_in); 
         byte[] bytes = new byte[1024]; 
         int c; 
         while ((c = is.read(bytes)) != -1) { 
               os.write(bytes, 0, c); 
          } 
      } finally { 
         if (is != null) { 
              is.close(); 
          } 
         if (os != null) { 
             os.close(); 
          } 
      } 
    return result; 

/** 
     * upload 
     * @throws java.lang.Exception 
     * @return 
     * @param filename 
     */ 
public long upload(String filename) 
throws Exception 

    String newname = ""; 
    if (filename.indexOf("/")>-1) 
     { 
        newname = filename.substring(filename.lastIndexOf("/")+1); 
     }else 
     { 
        newname = filename; 
     } 
    return upload(filename,newname); 


/** 
     *   download 
     *   从ftp下载文件到本地 
     * @throws java.lang.Exception 
     * @return 
     * @param newfilename 本地生成的文件名 
     * @param filename 服务器上的文件名 
     */ 
public long download(String filename,String newfilename) 
throws Exception 
{   
    long result = 0; 
     TelnetInputStream is = null; 
     FileOutputStream os = null; 
    try 
     { 
        is = ftpClient.get(filename);        
        java.io.File outfile = new java.io.File(newfilename); 
        os = new FileOutputStream(outfile); 
       byte[] bytes = new byte[1024]; 
       int c; 
       while ((c = is.read(bytes)) != -1) { 
            os.write(bytes, 0, c); 
            result = result + c; 
        } 
     } catch (IOException e) 
     { 
        e.printStackTrace(); 
     } 
    finally { 
         if (is != null) { 
              is.close(); 
          } 
         if (os != null) { 
             os.close(); 
          } 
      } 
     return result; 

/** 
   * 取得某个目录下的所有文件列表 
   * 
   */ 
public List getFileList(String path) 

     List list = new ArrayList(); 
    try 
     { 
        DataInputStream dis = new   DataInputStream(ftpClient.nameList(path)); 
       String filename = ""; 
       while((filename=dis.readLine())!=null)   
        {   
          list.add(filename);         
        }   
    
     } catch (Exception e) 
     { 
        e.printStackTrace(); 
     } 
    return list; 


/** 
     * closeServer 
     * 断开与ftp服务器的链接 
     * @throws java.io.IOException 
     */ 
public void closeServer() 
throws IOException 
{    
   try 
    { 
      if (ftpClient != null) 
       { 
         ftpClient.closeServer();      
       } 
    } catch (IOException e) { 
       e.printStackTrace(); 
    } 

   
  public static void main(String [] args) throws Exception 
   { 
     FtpUtil ftp = new FtpUtil(); 
    try { 
         //连接ftp服务器 
          ftp.connectServer("10.163.7.15", "cxl", "1", "info2"); 
         /**   上传文件到 info2 文件夹下 */ 
          System.out.println("filesize:"+ftp.upload("f:/download/Install.exe")+"字节"); 
         /** 取得info2文件夹下的所有文件列表,并下载到 E盘下 */ 
          List list = ftp.getFileList("."); 
         for (int i=0;i<list.size();i++) 
          { 
            String filename = (String)list.get(i); 
             System.out.println(filename); 
             ftp.download(filename,"E:/"+filename); 
          } 
     } catch (Exception e) { 
       /// 
     }finally 
     { 
        ftp.closeServer(); 
     } 
   }   
}
--------------------编程问答-------------------- 对JAVA的两个FTP包进行比较分析
作者:佚名出处:IT专家网2009-09-16 13:00本文对JAVA的两个FTP包进行比较 。
  1、sun.net.ftp.*;
  这是一个不被官方支持的,但是放在JDK下面的FTP包。正因为不被支

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

  所以文档也是没有的

  http://swig.stanford.edu/pub/java/javadoc/overview-summary.html

  这里有该包的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();//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,可以从以下地址

  下载

  http://mirror.vmmatrix.net/apache/jakarta/commons/net/binaries/commons-net-1.4

  .1.zip

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

  http://mirror.vmmatrix.net/apache/jakarta/commons/net/source/commons-net-1.4.1

  -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中即可。下载地址:

  http://mirror.vmmatrix.net/apache/jakarta/oro/source/jakarta-oro-2.0.8.zip

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

  且也是开源,免费的。

  这个包的问题是:

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

  这是不方便的地方。

  另外IBM也有提供一个ftp包。大家有兴趣可以搜索一下。 --------------------编程问答-------------------- --------------------编程问答-------------------- 谢谢6楼,我已经解决了java在实现ftp连接服务器的功能,但现在还是没有办法做到实现ftp的上传和删除功能,不知道有没有哪位大侠能帮忙解决疑惑?
我会追加积分的,谢谢了! --------------------编程问答-------------------- 考代码之前要看看需要的包
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,