这里使用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. 牛客OI周赛6-提高组 B 践踏

    践踏 思路: 如果k不为0, 那么就是对k取模意义下的区间更新, 单点查询 否则, 就是普通的区间更新, 单点查询 代码: #pragma GCC optimize(2) #pragma GCC op ...

  2. 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流

    最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...

  3. nginx ----> nginx配置/反向代理/负载均衡

    nginx [engine x]是一个HTTP和反向代理服务器,一个邮件代理服务器和一个通用的TCP/UDP代理服务器,最初由Igor Sysoev编写. 环境: Ubuntu16.04 安装ngin ...

  4. H3C常用配置和命令

    邻居发现命令display lldp neighbor-information list DHCP中继配置dhcp enabledhcp relay server-group 1 ip x.x.x.x ...

  5. pandas删除行删除列,增加行增加列

    创建df: >>> df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('ABCD'), index=list(' ...

  6. find_first_zero_bit在使用gcc 4.2.4 编译时,需要保护%eax

    1.3.100 find_first_zero_bit在使用gcc 4.2.4 编译时,需要保护%eax find_first_zero_bit 修订后: /* * Find-bit routines ...

  7. 『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归

    Step1: 目标: 使用线性模拟器模拟指定的直线:y = 0.1*x + 0.3 代码: import tensorflow as tf import numpy as np import matp ...

  8. 6月5 Smarty变量调节器

    变量调节器:<{$a|变量调节器}> 主要修改此页面的信息来了解变量调节器:test0605/main.php和模板文件:main0605.html 1.利用给定的变量调节器 capita ...

  9. 【Oracle】【7】去掉字符串中的空格/字符

    SELECT TRIM(' 去除前后空格 ') FROM DUAL; SELECT REPLACE(' 去除 任意位置的空格 ', ' ', '') FROM DUAL; 扩展: 1,both, tr ...

  10. git 恢复误删的分支

    在使用git的过程中,因为人为因素造成分支(commit)被删除,可以使用以下步骤进行恢复. 首先用以下步骤创建一个新分支,修改一些文件后删除,以便进行恢复. 1.创建分支 abc git branc ...