Java使用FTPClient类读写FTP

本文实例为大家分享了Java使用FTPClient类读写FTP的具体代码,供大家参考,具体内容如下

1.首先先导入相关jar包

2.创建一个连接FTP的工具类FTPUtil.java

package com.metarnet.ftp.util; 

import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.util.Properties; 

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger; 

public class FTPUtil {
  private static Logger logger = Logger.getLogger(FTPUtil.class); 

  /**
   * 获取FTPClient对象
   * @param ftpHost FTP主机服务器
   * @param ftpPassword FTP 登录密码
   * @param ftpUserName FTP登录用户名
   * @param ftpPort FTP端口 默认为21
   * @return
   */
  public static FTPClient getFTPClient(String ftpHost, String ftpPassword,
      String ftpUserName, int ftpPort) {
    FTPClient ftpClient = null;
    try {
      ftpClient = new FTPClient();
      ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
      ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
      if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
        logger.info("未连接到FTP,用户名或密码错误。");
        ftpClient.disconnect();
      } else {
        logger.info("FTP连接成功。");
      }
    } catch (SocketException e) {
      e.printStackTrace();
      logger.info("FTP的IP地址可能错误,请正确配置。");
    } catch (IOException e) {
      e.printStackTrace();
      logger.info("FTP的端口错误,请正确配置。");
    }
    return ftpClient;
  }
}

3.编写一个读取FTP上文件的类ReadFTPFile.java

package com.metarnet.ftp.read; 

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.SocketException; 

import org.apache.commons.net.ftp.FTPClient;
import org.apache.log4j.Logger; 

import com.metarnet.ftp.util.FTPUtil; 

public class ReadFTPFile {
  private Logger logger = Logger.getLogger(ReadFTPFile.class); 

  /**
   * 去 服务器的FTP路径下上读取文件
   *
   * @param ftpUserName
   * @param ftpPassword
   * @param ftpPath
   * @param FTPServer
   * @return
   */
  public String readConfigFileForFTP(String ftpUserName, String ftpPassword,
      String ftpPath, String ftpHost, int ftpPort, String fileName) {
    StringBuffer resultBuffer = new StringBuffer();
    FileInputStream inFile = null;
    InputStream in = null;
    FTPClient ftpClient = null;
    logger.info("开始读取绝对路径" + ftpPath + "文件!");
    try {
      ftpClient = FTPUtil.getFTPClient(ftpHost, ftpPassword, ftpUserName,
          ftpPort);
      ftpClient.setControlEncoding("UTF-8"); // 中文支持
      ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
      ftpClient.enterLocalPassiveMode();
      ftpClient.changeWorkingDirectory(ftpPath);
      in = ftpClient.retrieveFileStream(fileName);
    } catch (FileNotFoundException e) {
      logger.error("没有找到" + ftpPath + "文件");
      e.printStackTrace();
      return "下载配置文件失败,请联系管理员.";
    } catch (SocketException e) {
      logger.error("连接FTP失败.");
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
      logger.error("文件读取错误。");
      e.printStackTrace();
      return "配置文件读取失败,请联系管理员.";
    }
    if (in != null) {
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      String data = null;
      try {
        while ((data = br.readLine()) != null) {
          resultBuffer.append(data + "\n");
        }
      } catch (IOException e) {
        logger.error("文件读取错误。");
        e.printStackTrace();
        return "配置文件读取失败,请联系管理员.";
      }finally{
        try {
          ftpClient.disconnect();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }else{
      logger.error("in为空,不能读取。");
      return "配置文件读取失败,请联系管理员.";
    }
    return resultBuffer.toString();
  }
}

4.创建一个往FTP上写入文件的类WriteFTPFile.java

package com.metarnet.ftp.write; 

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream; 

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.log4j.Logger; 

import com.metarnet.ftp.util.FTPUtil; 

public class WriteFTPFile { 

  private Logger logger = Logger.getLogger(WriteFTPFile.class); 

  /**
   * 本地上传文件到FTP服务器
   *
   * @param ftpPath
   *      远程文件路径FTP
   * @throws IOException
   */
  public void upload(String ftpPath, String ftpUserName, String ftpPassword,
      String ftpHost, int ftpPort, String fileContent,
      String writeTempFielPath) {
    FTPClient ftpClient = null;
    logger.info("开始上传文件到FTP.");
    try {
      ftpClient = FTPUtil.getFTPClient(ftpHost, ftpPassword,
          ftpUserName, ftpPort);
      // 设置PassiveMode传输
      ftpClient.enterLocalPassiveMode();
      // 设置以二进制流的方式传输
      ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
      // 对远程目录的处理
      String remoteFileName = ftpPath;
      if (ftpPath.contains("/")) {
        remoteFileName = ftpPath
            .substring(ftpPath.lastIndexOf("/") + 1);
      }
      // FTPFile[] files = ftpClient.listFiles(new
      // String(remoteFileName));
      // 先把文件写在本地。在上传到FTP上最后在删除
      boolean writeResult = write(remoteFileName, fileContent,
          writeTempFielPath);
      if (writeResult) {
        File f = new File(writeTempFielPath + "/" + remoteFileName);
        InputStream in = new FileInputStream(f);
        ftpClient.storeFile(remoteFileName, in);
        in.close();
        logger.info("上传文件" + remoteFileName + "到FTP成功!");
        f.delete();
      } else {
        logger.info("写文件失败!");
      }
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      try {
        ftpClient.disconnect();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  } 

  /**
   * 把配置文件先写到本地的一个文件中取
   *
   * @param ftpPath
   * @param str
   * @return
   */
  public boolean write(String fileName, String fileContext,
      String writeTempFielPath) {
    try {
      logger.info("开始写配置文件");
      File f = new File(writeTempFielPath + "/" + fileName);
      if(!f.exists()){
        if(!f.createNewFile()){
          logger.info("文件不存在,创建失败!");
        }
      }
      BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));
      bw.write(fileContext.replaceAll("\n", "\r\n"));
      bw.flush();
      bw.close();
      return true;
    } catch (Exception e) {
      logger.error("写文件没有成功");
      e.printStackTrace();
      return false;
    }
  }
}

5.建立一个测试类FTPMain.java

package com.metarnet.ftp.main; 

import java.io.InputStream;
import java.util.Properties; 

import org.apache.log4j.Logger; 

import com.metarnet.ftp.read.ReadFTPFile;
import com.metarnet.ftp.util.FTPUtil;
import com.metarnet.ftp.write.WriteFTPFile; 

public class FTPMain { 

  private static Logger logger = Logger.getLogger(FTPMain.class); 

  public static void main(String[] args) {
    int ftpPort = 0;
    String ftpUserName = "";
    String ftpPassword = "";
    String ftpHost = "";
    String ftpPath = "";
    String writeTempFielPath = "";
    try {
      InputStream in = FTPUtil.class.getClassLoader()
          .getResourceAsStream("env.properties");
      if (in == null) {
        logger.info("配置文件env.properties读取失败");
      } else {
        Properties properties = new Properties();
        properties.load(in);
        ftpUserName = properties.getProperty("ftpUserName");
        ftpPassword = properties.getProperty("ftpPassword");
        ftpHost = properties.getProperty("ftpHost");
        ftpPort = Integer.valueOf(properties.getProperty("ftpPort"))
            .intValue();
        ftpPath = properties.getProperty("ftpPath");
        writeTempFielPath = properties.getProperty("writeTempFielPath"); 

        ReadFTPFile read = new ReadFTPFile();
        String result = read.readConfigFileForFTP(ftpUserName, ftpPassword, ftpPath, ftpHost, ftpPort, "huawei_220.248.192.200.cfg");
        System.out.println("读取配置文件结果为:" + result); 

        WriteFTPFile write = new WriteFTPFile();
        ftpPath = ftpPath + "/" + "huawei_220.248.192.200_new1.cfg";
        write.upload(ftpPath, ftpUserName, ftpPassword, ftpHost, ftpPort, result, writeTempFielPath);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
} 

最后肯定是执行,看最后执行结果,OK步骤已讲完。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /bin/bash uftp 3.设置用户密码 sudo useradd -d /home/uftp -s /bin/bash uftp 4.创建用户目录 sudo mkdir /home/uftp 5.设置用户密码 sudo passwd uftp 6.设置/etc/vsftpd.conf配置文件 s

  • 详解JAVA中使用FTPClient工具类上传下载

    详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 1.写一个javabean文件,描述ftp上传或下载的信息 实例代码: public class FtpUseBean { private String host; private Integer port; private String us

  • JAVA中使用FTPClient实现文件上传下载实例代码

    在java程序开发中,ftp用的比较多,经常打交道,比如说向FTP服务器上传文件.下载文件,本文给大家介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 一.上传文件 原理就不介绍了,大家直接看代码吧 /** * Description: 向FTP服务器上传文件 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保(cuihongbao@d-heaven.com)创建 * @param url F

  • Java中FTPClient上传中文目录、中文文件名乱码问题解决方法

    问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录名及文件名中的中文显示为"??". 原因: FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码. 解决方案: 1.将中文的目录或文件名转为iso-8859-1编码的字符.参考代码: 复制代码 代码如下: String name="目录名或文件名"; name=new String(name.getBytes(&qu

  • Java FTPClient实现文件上传下载

    在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 所用到的jar包有:  commons-net-1.4.1.jar  jakarta-oro.jar  一.上传文件 文件上传源代码 /** * Description: 向FTP服务器上传文件 * @Version1.0 * @param url FTP服务器hostname * @param

  • Java使用FTPClient类读写FTP

    本文实例为大家分享了Java使用FTPClient类读写FTP的具体代码,供大家参考,具体内容如下 1.首先先导入相关jar包 2.创建一个连接FTP的工具类FTPUtil.java package com.metarnet.ftp.util; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; import java.util.Properties; import or

  • java使用RandomAccessFile类基于指针读写文件实例代码

    java API中提供了一个基于指针操作实现对文件随机访问操作的类,该类就是RandomAccessFile类,该类不同于其他很多基于流方式读写文件的类.它直接继承自Object. public class RandomAccessFile extends Objectimplements DataOutput, DataInput, Closeable{...} 1.使用该类时可以指定对要操作文件的读写模式. 第一种模式是只读模式,第二种模式是读写模式.在创建该类实例时指定. @Test pu

  • Java Socket编程(二) Java面向连接的类

    文章来源:aspcn 作者:孙雯 Java面向连接的类 Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就像一部电话,他们必须建立一个连接和一人呼叫.所有的事情在到达时的顺序与它们出发时的顺序时一样.无连接的sockets操作就像是一个邮件投递,,没有什么保证,多个邮件可能在到达时的顺序与出发时的顺序不一样. 到底用哪种模式是邮应用程序的需要决定的.如果可靠性更重要的话,用面向连接的操作会好一些.比如文件服务器需要他们的数据的正确性和有序性.如果一些数据丢失

  • JSP 中Spring的Resource类读写中文Properties实例代码

    JSP 中Spring的Resource类读写中文Properties 摘要: Spring对Properties的读取进行了完善而全面的封装,对于写则仍需配合FileOutputStream进行. package com.oolong.common.util; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.sup

  • Java编程之文件读写实例详解

    本文实例讲述了Java编程中文件读写的方法.分享给大家供大家参考,具体如下: Java中文件读写操作的作用是什么? 回答这个问题时应该先想到的是Java只是一门语言,我们的一种使用工具而已,这样答案就明晰了,就是将外来的各种数据写入到某一个文件中去,用以保存下来:或者从文件中将其数据读取出来,供我们使用.就如下电影过程,从网络资源中下载一部电影保存于你电脑中(写文件),当你想看的时候就用播放器打开(读文件). Java中如何对文件进行读写操作? 先理一理,Java中的流分两种,字节流和字符流,其

  • java常用工具类 XML工具类、数据验证工具类

    本文实例为大家分享了java常用工具类的具体代码,供大家参考,具体内容如下 package com.jarvis.base.util; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.net.URL; import java.util.Properties

  • java使用apache commons连接ftp修改ftp文件名失败原因

    今天被ftp上中文名修改坑了好久 项目用的是 apache commons 里的 FtpClient 实现的对ftp文件的上传下载操作,今天增加了业务要修改ftp上的文件名,然后就一直的报错,问题是它修改名字的方法只返回一个boolean,没有异常,这就很蛋疼了,找了好久才发现是中文的名字的原因 改名 直接上代码 package net.codejava.ftp; import java.io.IOException; import org.apache.commons.net.ftp.FTPC

  • Java中实体类为什么要实现Serializable序列化的作用

    客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间.如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累大量的HttpSession对象,消耗大量的服务器内存,即使用户已经离开或者关闭了浏览器,web服务器仍要保留与之对应的HttpSession对象,在他们超时之前,一直占用web服务器内存资源. web服务器通常将那些暂时不活动但未超时的HttpSession对象转移到文件

  • Java基于JNDI 实现读写分离的示例代码

    目录 一.JNDI数据源配置 二.JNDI数据源使用 三.web.xml配置 四.spring-servlet.xml配置 五.spring-db.xml配置 六.log4j.properties配置 七.相关路由数据源切换逻辑代码 八.搭建过程中遇到的问题和解决方案 一.JNDI数据源配置 在Tomcat的conf目录下,context.xml在其中标签中添加如下JNDI配置: <Resource name="dataSourceMaster" factory="or

  • Java中文件的读写方法之IO流详解

    目录 1.File类 1.1File类概述和构造方法 1.2File类创建功能 1.3File类判断和获取功能 1.4File类删除功能 2.递归 2.1递归 2.2递归求阶乘 2.3递归遍历目录 3.IO流 3.1 IO流概述和分类 3.2字节流写数据 3.3字节流写数据的三种方式 3.4字节流写数据的两个小问题 3.5字节流写数据加异常处理 3.6字节流读数据(一次读一个字节数据) 3.7字节流复制文本文件 3.8字节流读数据(一次读一个字节数组数据) 3.9字节流复制图片 总结 1.Fil

随机推荐