java操作FTP还是很方便的,有多种开源支持,这里在apache开源的基础上自己进行了一些设计,使用起来更顺手和快捷。

思路:

  1.设计FTPHandler接口,可以对ftp,sftp进行统一操作,比如上传,下载,删除,获取关闭连接等

  2.对FTP和SFTP的实现

  3.设计一个工厂(考虑以后可能有sftp,ftp两种,目前只实现一种FTP的),用来生成FTPHandler

  4.简单使用说明

作为码农,上代码更实在。

接口 FTPHandler.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException; import org.apache.commons.net.ftp.FTPClient; public interface FTPHandler {
/**
* 获取连接
* @return
* @throws SocketException
* @throws IOException
*/
public boolean connect() throws SocketException, IOException;
/**
* 上传文件
* @param remotePath 要保存到的远程ftp目录
* @param originalFilename 要保存为远程ftp文件名
* @param is 输入流
* @return
*/
public boolean uploadFile(String remotePath,String originalFilename, InputStream is); /**
* 下载文件
* @param remotePath 文件所在的远程ftp目录
* @param filename 文件名
* @param os 输出流
* @return
* @throws IOException
*/
public boolean downFile(String remotePath,String filename, OutputStream os) throws IOException; /**
* 删除文件
* @param remotePath 文件所在ftp目录
* @param filename 文件名
* @return
* @throws IOException
*/
boolean deleteFiles(String remotePath,String filename) throws IOException; /**
* 关闭客户端
* @param ftpClient
*/
public void closeClient(FTPClient ftpClient); }

实现类 FTPHandlerImpl.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.Properties; import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class FTPHandlerImpl implements FTPHandler { private static final Logger LOGGER= LoggerFactory.getLogger(FTPHandlerImpl.class); private static String url="";
private static int port=21;
private static String username=null;
private static String password=null;
private static String remotePath=null;
private FTPClient ftpClient = null; static {
Properties configP;
try {
configP = PropertiesUtils.getWebLoProperties("configure");
url = configP.getProperty("downFileService.ftp.url");
username = configP.getProperty("downFileService.ftp.username");
password = configP.getProperty("downFileService.ftp.password");
remotePath = configP.getProperty("downFileService.ftp.remotePath");
// localPath = configP.getProperty("downFileService.ftp.localPath");
} catch (Exception e) {
e.printStackTrace();
}
} public FTPHandlerImpl() {
FTPClient ftpClient = new FTPClient();
this.ftpClient=ftpClient;
} @Override
public boolean connect() throws SocketException, IOException {
boolean success=true;
ftpClient.connect(url, port);
boolean login = ftpClient.login(username, password);
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
success=false;
}
return success&&login; } @Override
public boolean uploadFile(String _remotePath,String storeFilename, InputStream is) {
boolean success=false;
try {
// 切换到path指定的目录
if(StringUtils.isBlank(_remotePath)){
_remotePath=remotePath;
} createOrChangeDir(_remotePath);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
success = ftpClient.storeFile(storeFilename, is);
is.close();
} catch (IOException e) {
e.printStackTrace(); }
closeClient(ftpClient);
return success;
} @Override
public boolean downFile(String _remotePath,String filename, OutputStream os) throws IOException {
// 解决图片上传失真
//解决图片下载失真
// 切换到path指定的目录
if(StringUtils.isBlank(_remotePath)){
_remotePath=remotePath;
}
createOrChangeDir(_remotePath);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
FTPFile[] ftpFiles = ftpClient.listFiles();
boolean success=false;
for (FTPFile file : ftpFiles) {
if (file.getName().equals(filename)) {
filename = file.getName();
success = ftpClient.retrieveFile(filename, os);
break;
}
}
closeClient(ftpClient);
return success;
} @Override
public boolean deleteFiles(String _remotePath,String fileName) throws IOException {
// 切换到path指定的目录
if(StringUtils.isBlank(_remotePath)){
_remotePath=remotePath;
}
ftpClient.changeWorkingDirectory(_remotePath);
FTPFile[] ftpFiles = ftpClient.listFiles();
boolean isDelete = false;
for (FTPFile file : ftpFiles) {
if (fileName.equalsIgnoreCase(file.getName())) {
ftpClient.deleteFile(file.getName());
isDelete = true;
} }
closeClient(ftpClient);
return isDelete;
} @Override
public void closeClient(FTPClient ftpClient) {
try {
if (ftpClient != null) {
ftpClient.logout();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftpClient != null && ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
} } /**
* 创建目录(有则切换目录,没有则创建目录)
* @param dir
* @return
*/
private boolean createOrChangeDir(String dir){
if(StringUtils.isBlank(dir))
return true;
String d;
try {
//目录编码,解决中文路径问题
d = new String(dir.toString().getBytes("UTF-8"),"iso-8859-1");
//尝试切入目录
if(ftpClient.changeWorkingDirectory(d))
return true; dir = StringUtils.removeStart(dir, "/");
dir = StringUtils.removeEnd(dir, "/");
String[] arr = dir.split("/");
StringBuffer sbfDir=new StringBuffer();
//循环生成子目录
for(String s : arr){
sbfDir.append("/");
sbfDir.append(s);
//目录编码,解决中文路径问题
d = new String(sbfDir.toString().getBytes("UTF-8"),"iso-8859-1");
//尝试切入目录
if(ftpClient.changeWorkingDirectory(d))
continue;
if(!ftpClient.makeDirectory(d)){
LOGGER.info("[失败]ftp创建目录:"+sbfDir.toString());
return false;
}
LOGGER.info("[成功]创建ftp目录:"+sbfDir.toString());
}
//将目录切换至指定路径
return ftpClient.changeWorkingDirectory(d);
} catch (Exception e) {
e.printStackTrace();
return false;
}
} }

工场类 FTPFactory.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
public class FTPFactory { public static final String HANDLE_FTP="ftp";
public static final String HANDLE_SFTP="sftp"; /**
* 获取FTPHandler对象,目前只实现了ftp
* @param handleName HANDLE_FTP或HANDLE_SFTP
* @return
*/
public static FTPHandler getHandler(String handleName){
FTPHandler handler=null;
if(handleName.equals(HANDLE_FTP)){
handler=new FTPHandlerImpl();
}
return handler;
} public static void main(String[] args) throws SocketException, IOException {
FTPHandler handler = getHandler(HANDLE_FTP);
boolean connect = handler.connect();
if(connect){
File f=new File("C:\\Users\\pcdalao\\Desktop\\definitions.json");
InputStream is=new FileInputStream(f);
boolean uploadFile = handler.uploadFile("/upload_case/20170825/测试", "definition_test.json", is);
if(uploadFile){
System.out.println("success");
}else{ System.out.println("fail");
} } } }

使用的时候,直接从工程获取即可。

说明:PropertiesUtils这个工具类,有很多可以替代的实现,需要自己实现哦。

就此一个完整的FTP操作完成。记录一下,方便自己,也方便园子里的朋友参考。设计不当之处,请多多指教。

java操作FTP的一些工具方法的更多相关文章

  1. JQuery操作类数组的工具方法

    JQuery学习之操作类数组的工具方法 在很多时候,JQuery的$()函数都返回一个类似数据的JQuery对象,例如$('div')将返回div里面的所有div元素包装的JQuery对象.在这中情况 ...

  2. Java操作文件夹的工具类

    Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...

  3. Java操作FTP工具类(实例详解)

    这里使用Apache的FTP jar 包 没有使用Java自带的FTPjar包  工具类 package com.zit.ftp; import java.io.File; import java.i ...

  4. java 操作FTP

    package comm.ftp; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInput ...

  5. Java 操作Redis封装RedisTemplate工具类

    package com.example.redisdistlock.util; import org.springframework.beans.factory.annotation.Autowire ...

  6. Java操作XML的JAXB工具

    在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上 ...

  7. Java操作属性文件之工具类

    最近空闲时间整理一下平时常用的一下工具类,重复造轮子实在是浪费时间,如果不正确或者有待改善的地方,欢迎指教... package com.hsuchan.business.utils; import ...

  8. java后台获取Access_token的工具方法

    本方法主要通过java后台控制来获取Access_token,需要你已经知道自己的ID跟密码 因为微信的权限设置大概每天可以获取两千条,每条有效时间为2小时 /** * 输入自己的id跟密码,获取微信 ...

  9. java操作FTP,实现文件上传下载删除操作

    上传文件到FTP服务器: /** * Description: 向FTP服务器上传文件 * @param url FTP服务器hostname * @param port FTP服务器端口,如果默认端 ...

随机推荐

  1. python1.返回一个字符串中出现次数第二多的单词 2.字符串中可能有英文单词、标点、空格 3.字符串中的英文字符全部是小写

    import re from collections import Counter def second_count_word(s): # # 利用正则按标点和空格切割,有其他标点可以添加到[]内 # ...

  2. el-input的color修改无效问题

    相信很多前端初学者跟我一样也遇到过el-input的color修改无效问题 如下图:我想把el-input里面的文字改成蓝色,但是使用总是失败 修改方法:打开调试界面,找到el-input对应的sty ...

  3. “AS3.0高级动画编程”学习:第一章高级碰撞检测

    AdvancED ActionScript 3.0 Animation 是Keith Peters大师继"Make Things Move"之后的又一力作,网上已经有中文翻译版本了 ...

  4. dev 控件的treelist

    最近项目中要求用dev 控件的treelist 树形控件. 如下图 要求如下: 1:选择父节点后,子节点全部打钩: 2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状 ...

  5. CodeWarrior 10 自定义关键字模版

    ==============================================版本信息开始============================================ 相关作 ...

  6. 19-03【golang】strings包

    golang的strings包提供了字符串操作的一系列函数.下面做个简单介绍 函数 用法 备注 Compare(a,b sring) 比较两个字符串   Contains(s, substr stri ...

  7. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  8. springmvc的面试知识点总结

    新的一年,开启新的篇章,欧气满满,迎接未来. 前几天回顾了spring相关的知识点,现在再来回顾下springmvc相关的知识点做一下总结. 问题总结 之前面试问题总结的那篇文章中,与springmv ...

  9. HBase、MongoDB、cassandra比较

    前言 传统数据库遇到的问题,数据量很大的时候无法存储:没有很好的备份机制:数据达到一定数量开始缓慢,很大的话基本无法支撑:因此我们需要探究更加合适的数据库来支撑我们的业务. HBase 什么是HBas ...

  10. linux 7 更改主机名

    1.在/etc/default/grub 中的GRUB_CMDLINE_LINUX 加上两条参数 #vim  /etc/default/grub GRUB_CMDLINE_LINUX="cr ...