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 ...
随机推荐
- (转)Lua的table库函数insert、remove、concat、sort详细介绍
原帖链接:http://www.jb51.net/article/64711.htm#comments 有增注标识的地方为额外注释,非原帖内容. 函数列表:(增注:只能用于数组!) table.ins ...
- 常用标签(html+jstl+jsp)
html:(form.input) (table.tr.td) div (a. img.span) h1~h6 (select.option) (br.hr.center) (link.meta ...
- rabbimq
问题 启动RabbitMQ后,没法访问Web管理页面 解决 RabbitMQ安装后默认是不启动管理模块的,所以需要配置将管理模块启动 启动管理模块命令如下 rabbitmqctl start_ ...
- English trip V1 - B 14. There Are Flowers in My Office 我办公室里有花 Teacher:Lamb Key: There be(is/are)
In this lesson you will learn to describe a room or place. 这节课讲学习描述一个房间或地方 课上内容(Lesson) 1. Where do ...
- js传输图片路径
数据库中存储数据/commons/img/***.jpg格式的图片路径. "<a onclick=\"showImg(\'"+dataEle.imgPath.rep ...
- 1.1 从UNIX到Linux的发展历程
MIT的CTSS:第一个分时操作系统 ◼ Multics系统(Multiplexed Information and Computing System) ⚫ 1965年AT&T,MIT和GE的 ...
- python记录day24 模块的语法
使用模块的两种方式: import xxx from xxx import xxx 使用模块的优点: 1.实现代码的重用 2.可以把代码分类 一.import 导入模块的时候系统会做三件事 1.先去s ...
- js将url转换二维码
二维码生成库 qrcode.js /*from tccdn minify at 2014-6-4 14:59:43,file:/cn/c/c/qrcode.js*/ /** * @fileovervi ...
- yarn基本命令
参考文章:https://blog.csdn.net/mjzhang1993/article/details/70092902 1.安装 windows: 下载地址 mac: brew install ...
- kohana操作数据库
一.读取数据库记录 读取数据库记录需要使用到 DB::select() 方法 // 返回一个结果对象 $result = DB::select('column')->from('table_na ...