在項(xiàng)目中威沫,經(jīng)常會(huì)用到FTP服務(wù)器,這里做了一個(gè)簡單的聯(lián)系伤哺,基于FTPClient 對FTP文件進(jìn)行操作
package com.lovo.utils;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
/**
* 簡單操作FTP工具類 ,此工具類支持中文文件名燕侠,不支持中文目錄
* 如果需要支持中文目錄,需要 new String(path.getBytes("UTF-8"),"ISO-8859-1") 對目錄進(jìn)行轉(zhuǎn)碼
* @author WZH
*
*/
public class FTPUtil {
private static Logger logger = Logger.getLogger(FTPUtil.class);
/**
* 獲取FTPClient對象
* @param ftpHost 服務(wù)器IP
* @param ftpPort 服務(wù)器端口號
* @param ftpUserName 用戶名
* @param ftpPassword 密碼
* @return FTPClient
*/
public FTPClient getFTPClient(String ftpHost, int ftpPort,
String ftpUserName, String ftpPassword) {
FTPClient ftp = null;
try {
ftp = new FTPClient();
// 連接FPT服務(wù)器,設(shè)置IP及端口
ftp.connect(ftpHost, ftpPort);
// 設(shè)置用戶名和密碼
ftp.login(ftpUserName, ftpPassword);
// 設(shè)置連接超時(shí)時(shí)間,5000毫秒
ftp.setConnectTimeout(50000);
// 設(shè)置中文編碼集立莉,防止中文亂碼
ftp.setControlEncoding("UTF-8");
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
logger.info("未連接到FTP绢彤,用戶名或密碼錯(cuò)誤");
ftp.disconnect();
} else {
logger.info("FTP連接成功");
}
} catch (SocketException e) {
e.printStackTrace();
logger.info("FTP的IP地址可能錯(cuò)誤,請正確配置");
} catch (IOException e) {
e.printStackTrace();
logger.info("FTP的端口錯(cuò)誤,請正確配置");
}
return ftp;
}
/**
* 關(guān)閉FTP方法
* @param ftp
* @return
*/
public boolean closeFTP(FTPClient ftp){
try {
ftp.logout();
} catch (Exception e) {
logger.error("FTP關(guān)閉失敗");
}finally{
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
logger.error("FTP關(guān)閉失敗");
}
}
}
return false;
}
/**
* 下載FTP下指定文件
* @param ftp FTPClient對象
* @param filePath FTP文件路徑
* @param fileName 文件名
* @param downPath 下載保存的目錄
* @return
*/
public boolean downLoadFTP(FTPClient ftp, String filePath, String fileName,
String downPath) {
// 默認(rèn)失敗
boolean flag = false;
try {
// 跳轉(zhuǎn)到文件目錄
ftp.changeWorkingDirectory(filePath);
// 獲取目錄下文件集合
ftp.enterLocalPassiveMode();
FTPFile[] files = ftp.listFiles();
for (FTPFile file : files) {
// 取得指定文件并下載
if (file.getName().equals(fileName)) {
File downFile = new File(downPath + File.separator
+ file.getName());
OutputStream out = new FileOutputStream(downFile);
// 綁定輸出流下載文件,需要設(shè)置編碼集蜓耻,不然可能出現(xiàn)文件為空的情況
flag = ftp.retrieveFile(new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"), out);
// 下載成功刪除文件,看項(xiàng)目需求
// ftp.deleteFile(new String(fileName.getBytes("UTF-8"),"ISO-8859-1"));
out.flush();
out.close();
if(flag){
logger.info("下載成功");
}else{
logger.error("下載失敗");
}
}
}
} catch (Exception e) {
logger.error("下載失敗");
}
return flag;
}
/**
* FTP文件上傳工具類
* @param ftp
* @param filePath
* @param ftpPath
* @return
*/
public boolean uploadFile(FTPClient ftp,String filePath,String ftpPath){
boolean flag = false;
InputStream in = null;
try {
// 設(shè)置PassiveMode傳輸
ftp.enterLocalPassiveMode();
//設(shè)置二進(jìn)制傳輸茫舶,使用BINARY_FILE_TYPE,ASC容易造成文件損壞
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//判斷FPT目標(biāo)文件夾時(shí)候存在不存在則創(chuàng)建
if(!ftp.changeWorkingDirectory(ftpPath)){
ftp.makeDirectory(ftpPath);
}
//跳轉(zhuǎn)目標(biāo)目錄
ftp.changeWorkingDirectory(ftpPath);
//上傳文件
File file = new File(filePath);
in = new FileInputStream(file);
String tempName = ftpPath+File.separator+file.getName();
flag = ftp.storeFile(new String (tempName.getBytes("UTF-8"),"ISO-8859-1"),in);
if(flag){
logger.info("上傳成功");
}else{
logger.error("上傳失敗");
}
} catch (Exception e) {
e.printStackTrace();
logger.error("上傳失敗");
}finally{
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return flag;
}
/**
* FPT上文件的復(fù)制
* @param ftp FTPClient對象
* @param olePath 原文件地址
* @param newPath 新保存地址
* @param fileName 文件名
* @return
*/
public boolean copyFile(FTPClient ftp, String olePath, String newPath,String fileName) {
boolean flag = false;
try {
// 跳轉(zhuǎn)到文件目錄
ftp.changeWorkingDirectory(olePath);
//設(shè)置連接模式刹淌,不設(shè)置會(huì)獲取為空
ftp.enterLocalPassiveMode();
// 獲取目錄下文件集合
FTPFile[] files = ftp.listFiles();
ByteArrayInputStream in = null;
ByteArrayOutputStream out = null;
for (FTPFile file : files) {
// 取得指定文件并下載
if (file.getName().equals(fileName)) {
//讀取文件饶氏,使用下載文件的方法把文件寫入內(nèi)存,綁定到out流上
out = new ByteArrayOutputStream();
ftp.retrieveFile(new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"), out);
in = new ByteArrayInputStream(out.toByteArray());
//創(chuàng)建新目錄
ftp.makeDirectory(newPath);
//文件復(fù)制,先讀有勾,再寫
//二進(jìn)制
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
flag = ftp.storeFile(newPath+File.separator+(new String(file.getName().getBytes("UTF-8"),"ISO-8859-1")),in);
out.flush();
out.close();
in.close();
if(flag){
logger.info("轉(zhuǎn)存成功");
}else{
logger.error("復(fù)制失敗");
}
}
}
} catch (Exception e) {
logger.error("復(fù)制失敗");
}
return flag;
}
/**
* 實(shí)現(xiàn)文件的移動(dòng)疹启,這里做的是一個(gè)文件夾下的所有內(nèi)容移動(dòng)到新的文件,
* 如果要做指定文件移動(dòng)蔼卡,加個(gè)判斷判斷文件名
* 如果不需要移動(dòng)喊崖,只是需要文件重命名,可以使用ftp.rename(oleName,newName)
* @param ftp
* @param oldPath
* @param newPath
* @return
*/
public boolean moveFile(FTPClient ftp,String oldPath,String newPath){
boolean flag = false;
try {
ftp.changeWorkingDirectory(oldPath);
ftp.enterLocalPassiveMode();
//獲取文件數(shù)組
FTPFile[] files = ftp.listFiles();
//新文件夾不存在則創(chuàng)建
if(!ftp.changeWorkingDirectory(newPath)){
ftp.makeDirectory(newPath);
}
//回到原有工作目錄
ftp.changeWorkingDirectory(oldPath);
for (FTPFile file : files) {
//轉(zhuǎn)存目錄
flag = ftp.rename(new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"), newPath+File.separator+new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"));
if(flag){
logger.info(file.getName()+"移動(dòng)成功");
}else{
logger.error(file.getName()+"移動(dòng)失敗");
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error("移動(dòng)文件失敗");
}
return flag;
}
/**
* 刪除FTP上指定文件夾下文件及其子文件方法雇逞,添加了對中文目錄的支持
* @param ftp FTPClient對象
* @param FtpFolder 需要?jiǎng)h除的文件夾
* @return
*/
public boolean deleteByFolder(FTPClient ftp,String FtpFolder){
boolean flag = false;
try {
ftp.changeWorkingDirectory(new String(FtpFolder.getBytes("UTF-8"),"ISO-8859-1"));
ftp.enterLocalPassiveMode();
FTPFile[] files = ftp.listFiles();
for (FTPFile file : files) {
//判斷為文件則刪除
if(file.isFile()){
ftp.deleteFile(new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"));
}
//判斷是文件夾
if(file.isDirectory()){
String childPath = FtpFolder + File.separator+file.getName();
//遞歸刪除子文件夾
deleteByFolder(ftp,childPath);
}
}
//循環(huán)完成后刪除文件夾
flag = ftp.removeDirectory(new String(FtpFolder.getBytes("UTF-8"),"ISO-8859-1"));
if(flag){
logger.info(FtpFolder+"文件夾刪除成功");
}else{
logger.error(FtpFolder+"文件夾刪除成功");
}
} catch (Exception e) {
e.printStackTrace();
logger.error("刪除失敗");
}
return flag;
}
/**
* 遍歷解析文件夾下所有文件
* @param folderPath 需要解析的的文件夾
* @param ftp FTPClient對象
* @return
*/
public boolean readFileByFolder(FTPClient ftp,String folderPath){
boolean flage = false;
try {
ftp.changeWorkingDirectory(new String(folderPath.getBytes("UTF-8"),"ISO-8859-1"));
//設(shè)置FTP連接模式
ftp.enterLocalPassiveMode();
//獲取指定目錄下文件文件對象集合
FTPFile files[] = ftp.listFiles();
InputStream in = null;
BufferedReader reader = null;
for (FTPFile file : files) {
//判斷為txt文件則解析
if(file.isFile()){
String fileName = file.getName();
if(fileName.endsWith(".txt")){
in = ftp.retrieveFileStream(new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"));
reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String temp;
StringBuffer buffer = new StringBuffer();
while((temp = reader.readLine())!=null){
buffer.append(temp);
}
if(reader!=null){
reader.close();
}
if(in!=null){
in.close();
}
//ftp.retrieveFileStream使用了流荤懂,需要釋放一下,不然會(huì)返回空指針
ftp.completePendingCommand();
//這里就把一個(gè)txt文件完整解析成了個(gè)字符串喝峦,就可以調(diào)用實(shí)際需要操作的方法
System.out.println(buffer.toString());
}
}
//判斷為文件夾势誊,遞歸
if(file.isDirectory()){
String path = folderPath+File.separator+file.getName();
readFileByFolder(ftp, path);
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error("文件解析失敗");
}
return flage;
}
public static void main(String[] args) {
FTPUtil test = new FTPUtil();
FTPClient ftp = test.getFTPClient("192.168.199.172", 21, "user","password");
//test.downLoadFTP(ftp, "/file", "你好.jpg", "C:\\下載");
//test.copyFile(ftp, "/file", "/txt/temp", "你好.txt");
//test.uploadFile(ftp, "C:\\下載\\你好.jpg", "/");
//test.moveFile(ftp, "/file", "/txt/temp");
//test.deleteByFolder(ftp, "/txt");
test.readFileByFolder(ftp, "/");
test.closeFTP(ftp);
System.exit(0);
}
}