Java FTP 下载文件和文件夹

jopen 10年前

用apache下的common-net.jar包开发Java FTP下载功能

导入apache-net-2.0.jar到工程中以及其他jar


 import java.io.File;  import java.io.FileOutputStream;  import java.io.IOException;  import java.net.SocketException;      import org.apache.commons.net.ftp.FTP;  import org.apache.commons.net.ftp.FTPClient;  import org.apache.commons.net.ftp.FTPReply;  import org.apache.log4j.Logger;      /**   * 采用的是apache commons-net架包中的ftp工具类实现的   *    * @author chiyong   *    */  public class FtpCollectionUtil {  private String username;  private String password;  private String ftpHostName;  private int port = 21;  private FTPClient ftpClient = new FTPClient();  private FileOutputStream fos = null;  private Logger logger = Logger.getLogger(FtpCollectionUtil.class);      public FtpCollectionUtil(String username, String password,  String ftpHostName, int port) {  super();  this.username = username;  this.password = password;  this.ftpHostName = ftpHostName;  this.port = port;  }      /**  * 建立连接b  */  private void connect() {  try {  logger.debug("开始连接");  // 连接  ftpClient.connect(ftpHostName, port);  int reply = ftpClient.getReplyCode();  if (!FTPReply.isPositiveCompletion(reply)) {  ftpClient.disconnect();  }  // 登录  ftpClient.login(username, password);  ftpClient.setBufferSize(256);      ftpClient.setFileType(FTP.BINARY_FILE_TYPE);      ftpClient.setControlEncoding("utf8");  logger.debug("登录成功!");  logger.debug("开始登录!");  } catch (SocketException e) {  logger.error("", e);  } catch (IOException e) {  logger.error("", e);  }      }  /**  * 关闭输入输出流  *   * @param fos  */  private void close(FileOutputStream fos) {  try {  if (fos != null) {  fos.close();  }    ftpClient.logout();  logger.info("退出登录");  ftpClient.disconnect();  logger.info("关闭连接");  } catch (IOException e) {  logger.error("", e);  }  }      /**  * 下载文件  *   * @param ftpFileName  * @param localDir  */  public void down(String ftpFileName, String localDir) {  connect();  downFileOrDir(ftpFileName, localDir);  close(fos);  }      private void downFileOrDir(String ftpFileName, String localDir) {  try {  File file = new File(ftpFileName);      File temp = new File(localDir);      if (!temp.exists()) {  temp.mkdirs();  }  // 判断是否是目录  if (isDir(ftpFileName)) {  String[] names = ftpClient.listNames();  for (int i = 0; i < names.length; i++) {  System.out.println(names[i] + "^^^^^^^^^^^^^^");  if (isDir(names[i])) {  downFileOrDir(ftpFileName + '/' + names[i], localDir  + File.separator + names[i]);  ftpClient.changeToParentDirectory();  } else {  File localfile = new File(localDir + File.separator  + names[i]);  if (!localfile.exists()) {  fos = new FileOutputStream(localfile);  ftpClient.retrieveFile(names[i], fos);      } else {  logger.debug("开始删除文件");  file.delete();  logger.debug("文件已经删除");  fos = new FileOutputStream(localfile);  ftpClient.retrieveFile(ftpFileName, fos);      }      }  }  } else {      File localfile = new File(localDir + File.separator  + file.getName());  if (!localfile.exists()) {  fos = new FileOutputStream(localfile);  ftpClient.retrieveFile(ftpFileName, fos);      } else {  logger.debug("开始删除文件");  file.delete();  logger.debug("文件已经删除");  fos = new FileOutputStream(localfile);  ftpClient.retrieveFile(ftpFileName, fos);      }  ftpClient.changeToParentDirectory();      }      logger.info("下载成功!");  } catch (SocketException e) {  logger.error("连接失败!", e);  } catch (IOException e) {  logger.error("下载失败!", e);  }      }      // 判断是否是目录  public boolean isDir(String fileName) {  try {  // 切换目录,若当前是目录则返回true,否则返回true。  boolean falg = ftpClient.changeWorkingDirectory(fileName);  return falg;  } catch (Exception e) {  e.printStackTrace();  logger.error("", e);  }    return false;  }    public String getUsername() {  return username;  }  public void setUsername(String username) {  this.username = username;  }    public String getPassword() {  return password;  }  public void setPassword(String password) {  this.password = password;  }    public String getFtpHostName() {  return ftpHostName;  }  public void setFtpHostName(String ftpHostName) {  this.ftpHostName = ftpHostName;  }      public int getPort() {  return port;  }  public void setPort(int port) {  this.port = port;  }  public class TestFileUtil {      public static void main(String[] args) {  /**  * apache common-net实现的  */  FtpCollectionUtil ftpUtil = new FtpCollectionUtil("webfocus1",  "webfocus1", "192.168.0.2", 21);    // /home/webfocus1/apache-tomcat-6.0.37/webapps/NEZA_ROOT/要下载的文件夹。  ftpUtil.down(  "/home/webfocus1/apache-tomcat-6.0.37/webapps/NEZA_ROOT/",  "D://a");        }  }    }