这里使用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工具类(实例详解)的更多相关文章

  1. Java操作Redis工具类

    依赖 jar 包 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...

  2. java入门---对象和类&概念详解&实例

        Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载     这篇文章,我们主要来看下: 对象:对象是类的一个实例(对象不是找个女朋友),有状态 ...

  3. C# Oracle数据库操作类实例详解

    本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接.关闭连接.输出记录集.执行Sql语句,返回带分页功能的dataset .取表里字段的类型和长 ...

  4. java.util.concurrent.atomic 类包详解

    java.util.concurrent包分成了三个部分,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concurren ...

  5. java操作xml方式比较与详解(DOM、SAX、JDOM、DOM4J)

    java中四种操作(DOM.SAX.JDOM.DOM4J)xml方式的比较与详解     1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准. ...

  6. java操作excel 工具类

    java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...

  7. Java实体映射工具MapStruct使用详解

    1.序 通常在后端开发中经常不直接返回实体Entity类,经过处理转换返回前端,前端提交过来的对象也需要经过转换Entity实体才做存储:通常使用的BeanUtils.copyProperties方法 ...

  8. Java操作Excel工具类(poi)

    分享一个自己做的poi工具类,写不是很完全,足够我自己当前使用,有兴趣的可以自行扩展 1 import org.apache.commons.lang3.exception.ExceptionUtil ...

  9. hibernate工具类HibernateUtil详解

    1.为什么要用hibernateUtil这个类,先看这段代码:     //加载配置文件信息默认为hiberna.cfg.xml,如果不是的话那么就在config()方法里面去解析他      Con ...

随机推荐

  1. Redis消息之发布与订阅

    "发布/订阅"可以实现进程间的消息传递 发布的消息不会持久化,只能收到订阅后的消息,执行subscribe命令后客户端会进入"订阅"状态,处于此状态下的客户端不 ...

  2. C语言逗号运算符和逗号表达式基础总结

    逗号运算符的作用: 1,起分隔符的作用: 定义变量用于分隔变量:int a,b输入或输出时用于分隔输出表列 printf("%d%d",a,b) 2,用于逗号表达式的顺序运算符 语 ...

  3. 雷林鹏分享:jQuery EasyUI 表单 - 过滤下拉数据网格

    jQuery EasyUI 表单 - 过滤下拉数据网格 下拉数据网格(Combogrid)组件和下拉框(Combobox)组件的共同点是,除了都具有下拉面板以外,它们都是基于数据网格(Datagrid ...

  4. 20165327 学习基础和C语言基础调查

    学习基础和C语言基础调查 一.关于技能 1. 你有什么技能比大多人(超过90%以上)更好? 根据数据来看,应该是短跑(几次测速50米平均时间6.5s),上学期的体测中短跑这项成绩在班上排前面,我们这个 ...

  5. Python操作MySql --Python3

    Python版本:v3.7 模块:pymysql 1.连接数据库 connectDB.py: # coding:utf-8import pymysql host = 'localhost' # 主机u ...

  6. CSS3实现烟花特效 --web前端

    烟花特效,比较简单,直接贴代码了…… <!DOCTYPE html><html lang="en"><head> <meta charse ...

  7. Nested Comment Treads in ROR

    建立一个嵌套的评论 建立数据库结构和嵌套视图(使用Stimulus取元素和绑event) 可以删除评论,可以对嵌套视图的层数进行控制. 用Ajax代替完全的刷新页面. 删除一个评论,但不丢失它的子评论 ...

  8. vux, vue上拉加载更多

    <template> <" :bottom-method="loadBottom" :bottom-all-loaded="bottomAll ...

  9. chmod 没有x权限怎么办

    解决方法1:    # /lib64/ld-linux-x86-64.so.2 /bin/chmod 755 /bin/chmod   //linux动态命令库   解决方法2:方法2提到的两种方法形 ...

  10. BGP华为、思科选路规则

    选路规则 华为BGP选路规则 思科BGP选路规则 第0条 下一跳是否可达,如果不可达则不参与选路 BGP 向IBGP对等体发布import引入的IGP路由时, 将下一跳属性改为自身的接口地址,而非IG ...