[Java] 使用 Apache的 Commons-net库 实现FTP操作

    因为最近工作中需要用到FTP操作,而手上又没有现成的FTP代码。就去网上找了一下,发现大家都使用Apache的 Commons-net库中的FTPClient。

    但是,感觉用起来不太方便。又在网上找到了很多封装过的。觉得也不是很好用。于是就自己写了一个。网上大多是例子都是直接对文件进行操作,而我更需要的是读到内存,或者从内存上写。并且有很多实用单例模式,但是我觉得如果调用比较多的话,可能会出现问题。

  1 package com.best.oasis.util.helper;
  2 
  3 /**
  4  * 封装了一些FTP操作
  5  * Created by bl05973 on 2016/3/11.
  6  */
  7 
  8 import java.io.BufferedReader;
  9 import java.io.FileOutputStream;
 10 import java.io.IOException;
 11 import java.io.InputStream;
 12 import java.io.InputStreamReader;
 13 import java.io.OutputStream;
 14 import java.io.OutputStreamWriter;
 15 import java.util.ArrayList;
 16 import java.util.List;
 17 
 18 import org.apache.commons.net.ftp.FTP;
 19 import org.apache.commons.net.ftp.FTPClient;
 20 import org.apache.commons.net.ftp.FTPCmd;
 21 import org.apache.commons.net.ftp.FTPFile;
 22 import org.apache.commons.net.ftp.FTPReply;
 23 import org.apache.log4j.Logger;
 24 
 25 public class FTPUtil {
 26     private static Logger logger = Logger.getLogger(FTPUtil.class);
 27 
 28     private static FTPClient getConnection() {
 29         FTPClient client = new FTPClient();
 30         client.setControlEncoding("UTF-8");
 31         client.setDataTimeout(30000);
 32         client.setDefaultTimeout(30000);
 33         return client;
 34     }
 35 
 36     public static FTPClient getConnection(String host) throws IOException {
 37         FTPClient client = getConnection();
 38         client.connect(host);
 39         if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
 40             throw new IOException("connect error");
 41         }
 42         return client;
 43     }
 44     public static FTPClient getConnection(String host, int port) throws IOException {
 45         FTPClient client = getConnection();
 46         client.connect(host, port);
 47         if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
 48             throw new IOException("connect error");
 49         }
 50         return client;
 51     }
 52 
 53     public static FTPClient getConnection(String host, String username, String password) throws
 54             IOException {
 55         FTPClient client= getConnection(host);
 56         if (StringUtil.isNotBlank(username)) {
 57             client.login(username, password);
 58         }
 59         //if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
 60         //    throw new IOException("login error");
 61         //}
 62         return client;
 63     }
 64 
 65     public static FTPClient getConnection(String host, int port, String username, String password)
 66             throws IOException {
 67         FTPClient client = getConnection(host, port);
 68         if (StringUtil.isNotBlank(username)) {
 69             client.login(username, password);
 70         }
 71         //if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
 72         //    throw new IOException("login error");
 73         //}
 74         return client;
 75     }
 76 
 77     /**
 78      * 移动文件(若目标文件存在则不移动,并返回false)
 79      */
 80     public static boolean moveFile(String curFileName, String targetFileName, FTPClient client)
 81             throws IOException {
 82         int reply;
 83         reply = client.sendCommand(FTPCmd.RNFR, curFileName);
 84         if (FTPReply.isNegativePermanent(reply)) {
 85             //logger.error("FTP move file error. code:" + reply);
 86             System.out.println("FTP move file error. code:" + reply);
 87             return false;
 88         }
 89         reply = client.sendCommand(FTPCmd.RNTO, targetFileName);
 90         if (FTPReply.isNegativePermanent(reply)) {
 91             //logger.error("FTP move file error. code:" + reply);
 92             System.out.println("FTP move file error. code:" + reply);
 93             return false;
 94         }
 95         return true;
 96     }
 97 
 98     /**
 99      * 读取文件列表
100      */
101     public static List<String> getFileNameList(FTPClient client) throws IOException {
102         FTPFile[] files = client.listFiles();
103         List<String> fileNameList = new ArrayList<>();
104         for (FTPFile file : files) {
105             if (file.isFile()) {
106                 fileNameList.add(file.getName());
107             }
108         }
109         if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
110             throw new IOException("get file name list error");
111         }
112         return fileNameList;
113     }
114 
115     /**
116      * 读文件
117      */
118     public static String readFile(String path, FTPClient client) throws IOException {
119         client.setFileType(FTP.EBCDIC_FILE_TYPE);
120         InputStream is = client.retrieveFileStream(path);
121         if (is == null) {
122             return null;
123         }
124         BufferedReader bf = new BufferedReader(new InputStreamReader(is, "UTF-8"));
125         StringBuilder sb = new StringBuilder();
126         String str;
127         while ((str = bf.readLine()) != null) {
128             sb.append(str).append("\n");
129         }
130         bf.close();
131         client.completePendingCommand();
132         if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
133             throw new IOException("Remote file net closed success");
134         }
135         return sb.toString();
136     }
137 
138     @Deprecated
139     static boolean downFile(String remotePath, String localPath, FTPClient client)
140             throws IOException {
141         FileOutputStream fos = new FileOutputStream(localPath);
142         client.setFileType(FTPClient.BINARY_FILE_TYPE);
143         client.retrieveFile(remotePath, fos);
144         client.completePendingCommand();
145         if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
146             throw new IOException("Remote file net closed success");
147         }
148         return false;
149     }
150 
151     /**
152      * 写文件
153      */
154     public static boolean storeAsFile(String context, String remotePath, FTPClient client)
155             throws IOException {
156         OutputStream out = client.storeFileStream(remotePath);
157         OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
158         writer.write(context);
159         writer.flush();
160         writer.close();
161         return true;
162     }
163 
164     public static void close(FTPClient client) {
165         try {
166             if (client != null) {
167                 client.disconnect();
168             }
169         } catch (IOException e) {
170 
171         }
172     }
173 }
FTPUtil

 

   

posted @ 2016-03-18 21:48  Phantom01  阅读(987)  评论(0编辑  收藏  举报