工作中需要实现对远程FTP文件的各种操作,简单写了个静态FTP操作工具类,以下源码供大家参考:
public class FtpUtil {
private static FTPClient ftpClient = new FTPClient();
private static String encoding = System.getProperty("file.encoding");
private static String defaultPath;
/**
* FTP初始化连接
*/
public static boolean connect(String host,Integer port,String userName,String password) throws IOException{
return connect(host,port,userName,password,null);
}
/**
* FTP初始化连接
*/
public static boolean connect(String host,Integer port,String userName,String password,String remotePath) throws IOException{
boolean result=false;
try {
ftpClient.connect(host,port);
// 登录
ftpClient.login(userName, password);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 检验是否连接成功
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {//连接失败
ftpClient.disconnect();
result =false;
}else{//如果连接成功
result = true;
if(remotePath != null){
defaultPath = remotePath;
result =ftpClient.changeWorkingDirectory(new String(remotePath.getBytes(encoding),"iso-8859-1"));
if(result == false){
System.err.println("ftp changeWorkingDirectory to ".concat(remotePath).concat(" error"));
}
}
System.out.println("ftp connect successfully.");
}
} catch (SocketException e) {
System.err.println("ftp connect failed: " + e.getMessage());
throw e;
} catch (IOException e) {
System.err.println("ftp connect failed: " + e.getMessage());
throw e;
}
return result;
}
/**
* FTP是否连接
*/
public static boolean isConnected(){
return ftpClient.isConnected();
}
/**
* 上传文件
*/
public static boolean uploadFile(String filename, InputStream input) throws IOException {
return uploadFile(null,filename,input);
}
/**
* 上传文件
*/
public static boolean uploadFile(String remotePath, String filename, InputStream input) throws IOException {
boolean result = false;
if (!ftpClient.isConnected()) {
System.err.println("ftp uploadfile error : no ftpserver is connected");
return false;
}
try {
// 转移工作目录至指定目录下
if(remotePath != null){
ftpClient.changeWorkingDirectory(new String(remotePath.getBytes(encoding),"iso-8859-1"));
}
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
result = ftpClient.storeFile(new String(filename.getBytes(encoding),"iso-8859-1"), input);
} catch (IOException e) {
System.err.println("ftp uploadfile error : "+e.getMessage());
throw e;
} finally {
try {
if (input != null) {
input.close();
}
} catch (IOException e) {
System.err.println("ftp uploadfile close error : "+e.getMessage());
throw e;
}
}
System.out.println("ftp uploadfile successfully.");
return result;
}
/**
* 下载FTP文件
*/
public static boolean downFile(String fileName, String localPath) throws IOException {
return downFile(null,fileName,localPath);
}
/**
* 下载FTP文件
*/
public static boolean downFile( String remotePath, String fileName, String localPath) throws IOException {
boolean result = false;
if (!ftpClient.isConnected()) {
System.err.println("ftp download file error : no ftpserver is connected");
return false;
}
try {
// 转移工作目录至指定目录下
if(remotePath != null){
ftpClient.changeWorkingDirectory(new String(remotePath.getBytes(encoding),"iso-8859-1"));
}
System.out.println("ftp start download file :" + fileName);
// 获取文件列表
FTPFile[] fs = ftpClient.listFiles();
for (FTPFile ff : fs) {
if(fileName != null && !fileName.equals(ff.getName())){
continue;
}
File localFile = new File(localPath + "/" + ff.getName());
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(ff.getName(), os);
os.close();
System.out.println("ftp download file finished :"+ff.getName());
result = true;
}
if(result == false){
System.err.println("ftp download error cannot find file : " + fileName);
}
} catch (IOException e) {
System.err.println("ftp download error : "+e.getMessage());
throw e;
}
return result;
}
/**
* 关闭当前连接
*/
public static void close(){
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
System.err.println("ftp ftpserver close error : "+e.getMessage());
}
}
/**
* 返回连接默认路径
*/
public static void cdRoot() throws Exception{
try {
if (!ftpClient.isConnected()) {
System.err.println("ftp cd root error : no ftpserver is connected");
}
ftpClient.changeWorkingDirectory(new String("/".getBytes(encoding),"iso-8859-1"));
if(defaultPath != null){
ftpClient.changeWorkingDirectory(new String(defaultPath.getBytes(encoding),"iso-8859-1"));
}
} catch (Exception e) {
System.err.println("ftp change directory to defaultpath error : "+e.getMessage());
throw e;
}
}
/**
* 工作路径切换
*/
public static void cd(String path) throws Exception{
try {
if (!ftpClient.isConnected()) {
System.err.println(" ftp cd " + path + " : no ftpserver is connected");
}
ftpClient.changeWorkingDirectory(new String(path.getBytes(encoding),"iso-8859-1"));
} catch (Exception e) {
System.err.println("ftp cd ‘" + path + "‘ error : "+e.getMessage());
throw e;
}
}
/**
* 创建工作路径
*/
public static void mkdir(String path) throws IOException{
try {
if (!ftpClient.isConnected()) {
System.err.println("ftp mkdir error : no ftpserver is connected");
}
ftpClient.makeDirectory(path);
} catch (IOException e) {
System.err.println("ftp mkdir ‘" + path + "‘ error : "+e.getMessage());
throw e;
}
}
/**
* 查找文件是否存在
*/
public static FTPFile findFile(String filename) throws IOException{
return findFile(null,filename);
}
/**
* 查找文件是否存在
*/
public static FTPFile findFile(String remotePath, String filename) throws IOException{
try {
if (!ftpClient.isConnected()) {
System.err.println("ftp findfile error : no ftpserver is connected");
return null;
}
FTPFile[] fs = ftpClient.mlistDir(remotePath);
for (FTPFile ff : fs) {
if(filename != null && !filename.equals(ff.getName())){
continue;
}
return ff;
}
} catch (IOException e) {
System.err.println("ftp find file ‘" + filename + "‘ error : "+e.getMessage());
throw e;
}
return null;
}
}