Java操作FTP工具类(实例详解)
这里使用Apache的FTP jar 包
没有使用Java自带的FTPjar包
工具类
package com.zit.ftp; 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 java.util.Properties; 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; import com.zit.adapter.camera.CameraListener; public class FTPUtil { private static Logger logger = Logger.getLogger(FTPUtil.class); private static String classPath=CameraListener.class.getResource("/").getPath();
private static String filesPath = classPath.substring(, classPath.indexOf("WEB-INF")) + "file" ; private FTPClient ftpClient;
//从本地文件获取各种属性
private static String ftpIP=FTPConfig.getFTPHost();
private static Integer ftpPort=Integer.valueOf(FTPConfig.getFTPPort());
private static String ftpUserName=FTPConfig.getUserName();
private static String ftpPassword=FTPConfig.getPassword();
private static String ftpEncode = FTPConfig.getFTPEncode();
private static String localPath=FTPConfig.getLocalFilePath(); public FTPUtil() { } public synchronized boolean connectServer() {
ftpClient = new FTPClient();
ftpClient.setControlEncoding(ftpEncode);//解决上传文件时文件名乱码
int reply = ;
try {
// 连接至服务器
ftpClient.connect(ftpIP,ftpPort);
// 登录服务器
ftpClient.login(ftpUserName, ftpPassword);
//登陆成功,返回码是230
reply = ftpClient.getReplyCode();
// 判断返回码是否合法
if(!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return false;
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return true;
} //判断ftp服务器文件是否存在
public boolean existFile(String path) {
boolean flag = false;
FTPFile[] ftpFileArr;
try {
ftpFileArr = ftpClient.listFiles(path);
if (ftpFileArr.length > ) {
flag = true;
}
} catch (IOException e) {
e.printStackTrace();
}
return flag;
} //删除ftp文件
public synchronized boolean deleteFile(String pathname, String filename){
boolean flag = false;
try {
System.out.println("开始删除文件");
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
ftpClient.dele(filename);
ftpClient.logout();
flag = true;
System.out.println("删除文件成功");
} catch (Exception e) {
System.out.println("删除文件失败");
e.printStackTrace();
} finally {
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
}
return flag;
} //从FTP server下载到本地文件夹
public synchronized boolean download(String path){
boolean flag = false;
FTPFile[] fs=null;
try {
fs = ftpClient.listFiles("aaa");
if(fs.length<) {
return flag;
}
//1、遍历FTP路径下所有文件
for(FTPFile file:fs){ // File localFile = new File(localPath+"/"+file.getName());
//2、保存到本地
OutputStream os = new FileOutputStream(localFile);
//retrieveFile(FTP服务端的源路径),这个路径要和listFiles的路径一致
ftpClient.retrieveFile("aaa/" + file.getName(), os);
//3、删除FTP中的上面保存的文件
//循环外关闭,读一个关闭一次挺慢的
is.flush();
is.close();
}
flag = true;
} catch (IOException e) {
e.printStackTrace();
}
return flag;
} public synchronized boolean upload(InputStream inputStream , String fileName , String path) {
try { //切换工作路径,设置上传的路径
ftpClient.changeWorkingDirectory(path);
//设置1M缓冲
ftpClient.setBufferSize();
// 设置被动模式
ftpClient.enterLocalPassiveMode();
// 设置以二进制方式传输
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
/*
* 第一个参数:服务器端文档名
* 第二个参数:上传文档的inputStream
* 在前面设置好路径,缓冲,编码,文件类型后,开始上传
*/
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
closeClient();
} } public boolean checkSubfolder(String path, String subfolderName) {
try {
//切换到FTP根目录
ftpClient.changeWorkingDirectory(path);
//查看根目录下是否存在该文件夹
InputStream is = ftpClient.retrieveFileStream(new String(subfolderName.getBytes("UTF-8")));
if (is == null || ftpClient.getReplyCode() == FTPReply.FILE_UNAVAILABLE) {
//若不存在该文件夹,则创建文件夹
return createSubfolder(path,subfolderName);
}
if (is != null) {
is.close();
return true;
}
} catch (IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
return false;
} public synchronized boolean createSubfolder(String path,String subfolderName){
try {
ftpClient.changeWorkingDirectory(path);
ftpClient.makeDirectory(subfolderName);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return true;
} /**
* 断开与远程服务器的连接
*/
public void closeClient(){
if (ftpClient != null && ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
} } }
测试类:
package com.zit.test; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream; import com.zit.util.FTPUtil; public class TestFTP { public static void main(String[] args) { FTPUtil ftpClient = new FTPUtil();
ftpClient.connectServer(); try {
File file = new File("D:\\test.doc");
InputStream stream = new FileInputStream(file);
String ftpPath = "D:\\FTP";
String fileName = "文件夹";
boolean b = ftpClient.checkSubfolder(ftpPath, fileName);
if(stream != null && b) {
ftpClient.upload(stream, "aaa.doc", fileName);
} } catch (FileNotFoundException e) {
e.printStackTrace();
} }
}
实验工具:
filezilla server(FTP服务端工具)
官网下载即可
步骤
点击左上角小头像
1、Add新增用户,输入用户名
2、输入密码
3、Share folders 共享文件夹,就是设置FTP根目录
4、Add选择共享文件夹,在本地某文件夹即可
5、勾选该文件夹用户的权限,都选上
6、点击OK即可


实验结果:
运行测试类,即可看到,我已经把某个文档,上传到FTP根目录下了

Java操作FTP工具类(实例详解)的更多相关文章
- Java操作Redis工具类
依赖 jar 包 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...
- java入门---对象和类&概念详解&实例
Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 这篇文章,我们主要来看下: 对象:对象是类的一个实例(对象不是找个女朋友),有状态 ...
- C# Oracle数据库操作类实例详解
本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接.关闭连接.输出记录集.执行Sql语句,返回带分页功能的dataset .取表里字段的类型和长 ...
- java.util.concurrent.atomic 类包详解
java.util.concurrent包分成了三个部分,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concurren ...
- java操作xml方式比较与详解(DOM、SAX、JDOM、DOM4J)
java中四种操作(DOM.SAX.JDOM.DOM4J)xml方式的比较与详解 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准. ...
- java操作excel 工具类
java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...
- Java实体映射工具MapStruct使用详解
1.序 通常在后端开发中经常不直接返回实体Entity类,经过处理转换返回前端,前端提交过来的对象也需要经过转换Entity实体才做存储:通常使用的BeanUtils.copyProperties方法 ...
- Java操作Excel工具类(poi)
分享一个自己做的poi工具类,写不是很完全,足够我自己当前使用,有兴趣的可以自行扩展 1 import org.apache.commons.lang3.exception.ExceptionUtil ...
- hibernate工具类HibernateUtil详解
1.为什么要用hibernateUtil这个类,先看这段代码: //加载配置文件信息默认为hiberna.cfg.xml,如果不是的话那么就在config()方法里面去解析他 Con ...
随机推荐
- 第 8 章 容器网络 - 050 - 创建 overlay 网络
在 host1 中创建 overlay 网络 ov_net1: docker network create -d overlay ov_net1 -d overlay 指定 driver 为 over ...
- Bayesian generalized linear model (GLM) | 贝叶斯广义线性回归实例
一些问题: 1. 什么时候我的问题可以用GLM,什么时候我的问题不能用GLM? 2. GLM到底能给我们带来什么好处? 3. 如何评价GLM模型的好坏? 广义线性回归啊,虐了我快几个月了,还是没有彻底 ...
- canvas学习之折线图
接着上一张柱状图讲,我们是使用折线图: import {canvasPoint} from '../../assets/js/canvas';import {basicInfo,histogramMo ...
- MySQL表类型和存储引擎
一.基本介绍 从事务安全性的角度,可以把存储引擎分为两大类: 事务安全: BDB和innodb; 事务非安全性: myisam 和 memory 二.存储引擎的比较图 看你的mysql当前默认的存储引 ...
- 【洛谷p2312】解方程
(清明培训qwq,明天就要回学校了qwq拒绝) 行吧我洛谷都四天没碰了 解方程[传送门] 算法标签: (作为一个提高+省选-的题) 丁大佬真的很有幽默感emmm: #include <cstdi ...
- 终于可以从百度云上BOS读取数据到本地了
终于可以从百度云上BOS读取数据到本地了
- js定义类
以下是es5标准里定义类的方法: function Point(x,y){ this.x=x; this.y=y; } Point.prototype.toString=function(){ ret ...
- javascript作用域、闭包、对象与原型链
原文作者总结得特别好,自己收藏一下.^-^ 1.作用域1.1函数作用域JS的在函数中定义的局部变量只对这个函数内部可见,称之谓函数作用域.它没有块级作用域(因此if.for等语句中的花括号不是独立作用 ...
- 使用INTERSECT运算符
显示符合以下条件的雇员的雇员ID 和职务ID:这些雇员的当前职务与以前的职务相同,也就是说这些雇员曾担任过别的职务,但现在又重新担任了以前的同一职务. hr@TEST0924> SELECT e ...
- sun.misc.BASE64Encoder图片编码,并在页面显示
Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入.在上面的Data URI中,data表示取得数据的协定名称,image/pn ...