这里使用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. js怎么把一个数组里面的值作为一个属性添加到另一数组包含的对象里(小程序)

    上面这个需求我说的似乎不太明白,之前也是没有碰到过,也是最近在搞小程序,涉及到小程序前后台数据交互,展示的部分!!不太明白没关系等会我给大家举个例子,就明白了说起来有点拗口,一看就明白了,其实如果是原 ...

  2. Unity --- 如何降低UI的填充率

    1.首先简单介绍一下什么叫填充率: Fill Rate(填充率)是指显卡每帧或者说每秒能够渲染的像素数.在每帧绘制中,如果一个像素被反复绘制的次数越多,那么它占用的资源也必然更多.目前在移动设备上,F ...

  3. Asp.net core 学习笔记 ( ViewComponent 组件 )

    refer : https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components core 和 Angular 的 comp ...

  4. Java Spring JDBC访问数据库

    一.首先采用org.springframework.jdbc.datasource.DriverManagerDataSource类进行实现 1.applicationContext.xml配置如下: ...

  5. js插件---iCheck是用来做什么的

    js插件---iCheck是用来做什么的 一.总结 一句话总结:25 种参数 用来定制复选框(checkbox)和单选按钮(radio button) 定制复选框 定制单选按钮 1.iCheck常用的 ...

  6. hibernate例子

    首先下载好hibernate包 如果运行之后出现数据库连接错误  则重新把jar包位置放在web-inf的lib下面再addbulidpath 第一步:创建实体类 Hibernate要求实体类必须提供 ...

  7. MySQL中如何实现select top n ----Limit

    Mysql中limit的用法详解 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. LIMIT 子句可以被用于强制 S ...

  8. ADO.NET介绍2

    一.Connection对象 Connection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接.所有Connection对象的基类都是DbConnection类. Co ...

  9. 单细胞数据初步处理 | drop-seq | QC | 质控 | 正则化 normalization

    比对 The raw Drop-seq data was processed with the standard pipeline (Drop-seq tools version 1.12 from ...

  10. 2017-2018-2 20165303 实验二《Java面向对象程序设计》实验报告

    实验一 实验要求 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习 提交最后三个JUnit测试用例(正常情况, ...