java操作FTP的一些工具方法
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的一些工具方法的更多相关文章
- JQuery操作类数组的工具方法
JQuery学习之操作类数组的工具方法 在很多时候,JQuery的$()函数都返回一个类似数据的JQuery对象,例如$('div')将返回div里面的所有div元素包装的JQuery对象.在这中情况 ...
- Java操作文件夹的工具类
Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...
- Java操作FTP工具类(实例详解)
这里使用Apache的FTP jar 包 没有使用Java自带的FTPjar包 工具类 package com.zit.ftp; import java.io.File; import java.i ...
- java 操作FTP
package comm.ftp; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInput ...
- Java 操作Redis封装RedisTemplate工具类
package com.example.redisdistlock.util; import org.springframework.beans.factory.annotation.Autowire ...
- Java操作XML的JAXB工具
在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上 ...
- Java操作属性文件之工具类
最近空闲时间整理一下平时常用的一下工具类,重复造轮子实在是浪费时间,如果不正确或者有待改善的地方,欢迎指教... package com.hsuchan.business.utils; import ...
- java后台获取Access_token的工具方法
本方法主要通过java后台控制来获取Access_token,需要你已经知道自己的ID跟密码 因为微信的权限设置大概每天可以获取两千条,每条有效时间为2小时 /** * 输入自己的id跟密码,获取微信 ...
- java操作FTP,实现文件上传下载删除操作
上传文件到FTP服务器: /** * Description: 向FTP服务器上传文件 * @param url FTP服务器hostname * @param port FTP服务器端口,如果默认端 ...
随机推荐
- 2017-11-11 Sa Oct Spider
2017-11-11 Sa Oct Spider 4:33 PM Again. Firstly test liburl: # -*- coding: utf-8 -*- import json imp ...
- java使用c3p0连接mysql,写中文数据乱码的问题
此文说的乱码,是指所有中文的字符都变成了?. 首先,网上普遍搜索到的解决方案都是告诉你要在数据库连接字符串里面增加编码的定义,完整的连接字符串如下: url="jdbc:mysql://12 ...
- o2o、c2c、b2c、b2b、b2b2c都是什么?
o2o:线上线下,如线上消费,线下享受服务,o2o是不需要物流的,是线上购买的东西,自己去线下获得.c2c:个人对个人,消费者与消费者之间的小成本交易,买卖双方都不是公司,如你在咸鱼上卖自己的东西.b ...
- 吴裕雄 python 机器学习——分类决策树模型
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_s ...
- Java框架spring Boot学习笔记(七):@Configuration,@bean注解
@Configuration作用在类上,相当于一个xml文件 @bean作用于方法上,相当于xml配置中的<bean>标签 一个例子: 新建一个Springboot工程 新建一个User类 ...
- linux系统ssh免密钥登录配置
linux主机配置ssh免密钥登录,具体配置如下: 1.执行命令ssh-keygen -t rsa,生成公钥和私钥(具体步骤详见下图) 2.会在当前用户的家目录的.ssh/生成公钥和私钥, 3.执行s ...
- HBase 数据迁移方案介绍
一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类: 图1.HBase数据迁移方案 从上面图中可看出,目前的方案主要有四类,Hadoop层有一类,HBase层有三类.下 ...
- 新学python画一个爱心
from turtle import * def curvemove(): for i in range(200): right(1) forward(1) color('yellow','red') ...
- logistics回归理解
多元回归方程:假设有一个因变量y和一组自变量x1, x2, x3, ... , xn,其中y为连续变量,我们可以拟合一个线性方程: y =β0 +β1*x1 +β2*x2 +β3*x3 +...+βn ...
- 51-迷宫(一)- java版dfs和bfs
一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头君是否有可以逃出去的路. 输入格式 第一行输入两个整数 nn ...