lifeioooo 发表于 2013-1-15 02:18:09

Java中FTP的操作(上传文件、下载文件、删除文件……)

最近项目里的一个功能需要两个系统中文件在FTP中操作,所以对FTP做了点方法的封装,记录下来

    实际环境 BOSS系统 与业务平台 对账的使用。

    业务简单描述: BOSS系统发送对账的报文到业务平台,业务平台根据报文内容 查询出业务平台中所需要提供的数据写入文件,并上传至FTP服务器,供BOSS系统下载

   


    1.首先是对于文件的写入

   思路、业务要求文件大小 默认500M最大2G 所以要使写入的效率高点 采用下面的写法

   


public class FtpFile {private final static Log logger = LogFactory.getLog(FtpFile.class);BufferedReader bufferedReader;BufferedWriter bufferedWriter;InputStreamReader reader;/** * 生成数据文件 ** @param filePath 写入文件的路径 * @param content 写入的字符串内容 * @return */public boolean string2File(String content, String filePath) {boolean flag = true;try {File file = new File(filePath);if (!file.exists()) {file.createNewFile();}bufferedReader = new BufferedReader(new StringReader(content));bufferedWriter = new BufferedWriter(new FileWriter(file));char buffer[] = new char;int len;while ((len = bufferedReader.read(buffer)) != -1) {bufferedWriter.write(buffer, 0, len);}bufferedWriter.flush();bufferedReader.close();bufferedWriter.close();} catch (IOException e) {logger.error(e);flag = false;return flag;} finally {if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {logger.error(e);}}}return flag;}}   


这是将字符串写入指定文件的方法 有写就有读

/** * 读取数据文件 * @param filePath 读取的文件路径 * @param encoding 读取后的字符串编码集设置 * @return */public String file2String(String filePath, String encoding) {StringWriter writer = new StringWriter();File file = new File(filePath);try {if (encoding == null || "".equals(encoding.trim())) {reader = new InputStreamReader(new FileInputStream(file));} else {reader = new InputStreamReader(new FileInputStream(file), encoding);}// 将输入流写入输出流char[] buffer = new char;int n = 0;while (-1 != (n = reader.read(buffer))) {writer.write(buffer, 0, n);}} catch (Exception e) {logger.error(e);return null;} finally {if (reader != null)try {reader.close();} catch (IOException e) {logger.error(e);}}// 返回转换结果if (writer != null) {return writer.toString();} else {return null;}}
上面方法传入字符编码是为了防止出现中文乱码的情况

文件的读写问题都已经解决了 那么现在就是对FTP的操作了作为服务器 肯定要对其连接
下面给出的就是对于FTP基本操作的一个封装

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import sun.net.TelnetInputStream;import sun.net.TelnetOutputStream;import sun.net.ftp.FtpClient;public class FtpBusiness {private final static Log logger = LogFactory.getLog(FtpBusiness.class);/** * 创建连接 ** @param IP FTP服务器地址 * @param userName FTP服务器用户名 * @param passWord FTP服务器密码 * @return * @throws Exception */public FtpClient ftpConnection(String IP, String userName, String passWord)throws Exception {FtpClient fc = null;try {fc = new FtpClient();fc.openServer(IP);fc.login(userName, passWord);fc.binary();} catch (Exception e) {logger.error(e);}return fc;}/** * 关闭连接 ** @param fc FTP连接对象 * @return */public boolean ftpClose(FtpClient fc) {try {fc.closeServer();} catch (Exception e) {logger.error(e);return false;}return true;}/** * 获取当前目录 ** @param fc FTP连接对象 * @return */public String ftpPWD(FtpClient fc){try {return fc.pwd();} catch (Exception e) {logger.error(e);return null;}}public void ftpCD(FtpClient fc, String path){try {fc.cd(path);} catch (Exception e) {logger.error("FTP 转换到目录" + path + "异常:" + e);}}/** * 获取文件列表 ** @param fc FTP连接对象 * @return * @throws Exception */public String ftpList(FtpClient fc){try {TelnetInputStream is = fc.list();StringBuffer sb = new StringBuffer();int k;while ((k = is.read()) != -1) {sb.append((char) k);}is.close();return new String(sb.toString().getBytes("iso-8859-1"), "GBK");} catch (Exception e) {logger.error(e);return null;}}/** * 下载文件 ** @param fc FTP连接对象 * @param filename 下载的文件名称 * @return * @throws Exception */public InputStream getFile(FtpClient fc, String filename){InputStream is = null;try {fc.binary();is = fc.get(filename);return is;} catch (Exception e) {logger.error("下载文件:" + filename + " 异常");return null;}}/** * 上传文件 ** @param fc FTP连接对象 * @param filename上传的文件名称 * @return * @throws IOException */public boolean ftpPut(FtpClient fc, String filename, String Url) {FileInputStream is = null;TelnetOutputStream os = null;try {os = fc.put(filename);File file_in = new File(Url);is = new FileInputStream(file_in);byte[] bytes = new byte;int c;while ((c = is.read(bytes)) != -1) {os.write(bytes, 0, c);}} catch (IOException ex) {logger.error(ex);return false;} finally {try {is.close();os.close();} catch (Exception e) {logger.error(e);}}return true;}/** * 删除文件 ** @param fc FTP连接对象 * @param filename 删除的文件名称 * @return */public boolean ftpDelete(FtpClient fc, String filename) {try {fc.cd(ftpPWD(fc));} catch (IOException e) {logger.error(e);return false;} fc.sendServer("dele " + filename + "\r\n");try {fc.readServerResponse();} catch (IOException e) {logger.error(e);}return true;}}


上面提供了对FTP的操作 估计有了上面的内容 再做FTP的时候基本有个概念了 不足是上传和下载和删除由于时间关系没有做批量的实现。
后带小例子
页: [1]
查看完整版本: Java中FTP的操作(上传文件、下载文件、删除文件……)