package lixj.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import java.util.logging.Logger; import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply; public class FTPUtils { private static FTPUtils instance = null;
private static FTPClient ftpClient = null;
//本地文件目录所在磁盘路径
private static final String DISC_PATH = "D:/server";
// 本地字符编码
private static final String LOCAL_CHARSET = "GBK";
// FTP协议规定文件名编码为iso-8859-1
private static final String SERVER_CHARSET = "ISO-8859-1"; //FTP服务器IP
private String server = "172.20.10.105";
//FTP服务器端口
private int port = 21;
//FTP用户名
private String userName = "lixj";
//FTP用户密码
private String userPassword = "123456"; //日志工具
private static Logger logger = Logger.getLogger(FTPUtils.class.getName()); public static FTPUtils getInstance(){
if(instance == null){
instance = new FTPUtils();
}
ftpClient = new FTPClient();
return instance;
} /**
* 连接FTP服务器
* @return
*/
private boolean connect(){
boolean stat = false;
try {
if(ftpClient.isConnected())
return true;
ftpClient.connect(server, port);
stat = true;
} catch (SocketException e) {
stat = false;
e.printStackTrace();
} catch (IOException e) {
stat = false;
e.printStackTrace();
}
return stat;
} /**
* 打开FTP服务器
* @return
*/
public boolean open(){
if(!connect()){
return false;
} boolean stat = false;
try {
stat = ftpClient.login(userName, userPassword);
// 检测连接是否成功
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
close();
stat = false;
}
} catch (IOException e) {
e.printStackTrace();
stat = false;
}
return stat;
} /**
* 关闭FTP服务器
*/
public void close(){
if(ftpClient != null && ftpClient.isConnected()){
try {
ftpClient.logout();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
ftpClient.disconnect();
ftpClient = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} /**
* 同步文件
* @param relativeFilePath 文件相对路径
* @return succ = true | fail = false
*/
public boolean syncFile(String relativeFilePath) {
if (relativeFilePath == null || "".equals(relativeFilePath.trim())) {
logger.info("文件相对路径不能为空!");
return false;
}
if (new File(DISC_PATH + relativeFilePath).exists()) { //本地存在文件,执行文件上传操作
logger.info("上传文件【"+relativeFilePath+"】");
return uploadFile(DISC_PATH, relativeFilePath);
} else {//本地不存在文件,到FTP服务器下载文件
logger.info("下载文件【"+relativeFilePath+"】");
return downloadFile(DISC_PATH, relativeFilePath);
}
} /**
* 上传文件
* @param discPath 文件所在磁盘路径
* @param relativePath 文件所在相对路径
* @return succ = true | fail = false
*/
public boolean uploadFile(String discPath, String relativePath){
if (discPath == null || "".equals(discPath.trim())) {
logger.info("discPath 文件所在磁盘路径不能为空!");
return false;
}
if (relativePath == null || "".equals(relativePath.trim())) {
logger.info("relativePath 文件相对路径不能为空!");
return false;
}
String dir = relativePath.substring(0, relativePath.lastIndexOf("/"));
String filename = relativePath.substring(relativePath.lastIndexOf("/")+1);
logger.info("文件相对目录="+dir);
logger.info("文件名="+filename);
return uploadFile(dir, filename, discPath + relativePath);
} /**
* 上传文件到FTP服务器
* @param ftpPath FTP-目录
* @param ftpFileName FTP-文件名
* @param filePath 本地文件完整路径
* @return succ = true | fail = false
*/
public boolean uploadFile(String ftpPath, String ftpFileName, String filePath){
FileInputStream input = null;
try {
mkFtpDirs(ftpPath);
ftpClient.changeWorkingDirectory(changeCode(ftpPath));
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding(LOCAL_CHARSET);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
input = new FileInputStream(new File(filePath));
boolean result = ftpClient.storeFile(changeCode(ftpFileName), input);
if (result) {
logger.info("上传成功!");
} else {
logger.info("上传失败!");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
input = null;
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
}
return false;
} /**
* 下载文件
* @param discPath 文件所在磁盘路径
* @param relativePath 文件所在相对路径
* @return
*/
public boolean downloadFile(String discPath, String relativePath){
if (discPath == null || "".equals(discPath.trim())) {
logger.info("discPath 文件所在磁盘路径不能为空!");
return false;
}
if (relativePath == null || "".equals(relativePath.trim())) {
logger.info("relativePath 文件路径不能为空!");
return false;
}
String dir = relativePath.substring(0, relativePath.lastIndexOf("/"));
String filename = relativePath.substring(relativePath.lastIndexOf("/")+1);
logger.info("文件相对目录="+dir);
logger.info("文件名="+filename);
return downloadFile(dir, filename, discPath + dir);
} /**
* 下载文件路径
* @param ftpPath
* @param ftpFileName
* @param localPath
* @return
*/
public boolean downloadFile(String ftpPath, String ftpFileName, String localPath) {
FileOutputStream fos = null ;
try {
File localDirFile = new File(localPath);
if (!localDirFile.exists()) {
localDirFile.mkdirs();
}
fos = new FileOutputStream(new File(localPath, ftpFileName));
ftpClient.enterLocalPassiveMode();
ftpClient.changeWorkingDirectory(changeCode(ftpPath)) ;
boolean result = ftpClient.retrieveFile(changeCode(ftpFileName), fos);
if (result) {
logger.info("下载成功!");
} else {
logger.info("下载失败!");
}
return result;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos!=null) {
try {
fos.close() ;
fos = null ;
} catch (Exception e2) { }
}
}
return false;
} /***
* 创建FTP服务器多个层级目录
* @param dir e.g:/目录1/目录2/目录3
* @return
*/
public boolean mkFtpDirs(String dir){
boolean stat = false;
String[] dirs = dir.split("/");
if(dirs.length == 0){
return stat;
}
try {
ftpClient.changeToParentDirectory();
for(String dirss : dirs){
ftpClient.makeDirectory(changeCode(dirss));
ftpClient.changeWorkingDirectory(changeCode(dirss));
}
ftpClient.changeToParentDirectory();
stat = true;
} catch (IOException e) {
e.printStackTrace();
stat = false;
}
return stat;
} /**
* 删除文件
* @param filePathName
* @return
*/
public boolean removeFtpFile(String filePathName){
boolean stat = false;
try{
stat = ftpClient.deleteFile(changeCode(filePathName));
}catch(Exception e){
e.printStackTrace();
stat = false;
}
return stat;
} /**
* 转换文件或目录字符编码
* @param fileOrDirName 文件名或目录名
* @return 转换后的字符串
*/
private String changeCode(String fileOrDirName) {
try {
return new String(fileOrDirName.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
} public static void main(String[] args) {
FTPUtils ftp = FTPUtils.getInstance();
ftp.open();
ftp.syncFile("/upload/测试目录/建设项目技术规范书V3.5(1).docx");
ftp.close();
} }

基于FTP服务、JAVA实现文件同步操作的更多相关文章

  1. 基于RMI服务传输大文件的完整解决方案

    基于RMI服务传输大文件,分为上传和下载两种操作,需要注意的技术点主要有三方面,第一,RMI服务中传输的数据必须是可序列化的.第二,在传输大文件的过程中应该有进度提醒机制,对于大文件传输来说,这点很重 ...

  2. ftpget 从Windows FTP服务端获取文件

    /********************************************************************************* * ftpget 从Windows ...

  3. 转:【专题十一】实现一个基于FTP协议的程序——文件上传下载器

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  4. C# FileStream进行FTP服务上传文件和下载文件

    定义FileStream类的操作类:操作类名: FtpUpDown 上传文件 /// <summary> /// 上传文件 /// </summary> /// <par ...

  5. C# WebClient进行FTP服务上传文件和下载文件

    定义WebClient使用的操作类: 操作类名称WebUpDown WebClient上传文件至Ftp服务: //// <summary> /// WebClient上传文件至Ftp服务 ...

  6. 基于ftp服务的三种登录方式及其相关的访问控制和优化

    ftp(简单文件传输协议),是一种应用广泛的网络文件传输协议和服务,占用20和21号端口,主要用于资源的上传和下载. 在linux对于ftp同widows一样具有很多的种类,这里主要介绍vsfptd( ...

  7. 专题十一:实现一个基于FTP协议的程序——文件上传下载器

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  8. 基于ftp服务实现yum网络共享

    安装ftp服务:yum install vsftpd 安装后: CentOS7 启动服务:systemctl start vsftpd 设置开机启动:systemctl enable vsftpd 同 ...

  9. Java实现连接FTP服务并传递文件

    public class FtpClientUtil { private String host; private int port; private String username; private ...

随机推荐

  1. sublime中如何安装vue.js插件,并使代码高亮显示

    前提概要: sublime的下载地址:http://www.sublimetext.com/ notepad++下载地址:https://notepad-plus-plus.org/ .vue的文件在 ...

  2. ubuntu16.04下hive安装与配置

    Hive是什么? 由Facebook开源用于解决海量 结构化日志的数据统计: Hive是基于Hadoop的一个 数据仓库工具,可以将结构化的数据文件映射 成一张表,并提供类SQL查询功能: 构建在Ha ...

  3. 阿里巴巴fastjson 包的使用解析json数据

    Fastjson是一个Java语言编写的高性能功能完善的JSON库.由阿里巴巴公司团队开发的. 主要特性主要体现在以下几个方面: 1.高性能 fastjson采用独创的算法,将parse的速度提升到极 ...

  4. linux c编程:管道

    2在前面介绍过,进程之间交换信息的唯一途径就是传送打开的文件.可以经由fork或者exec来传送.这一章将介绍新的进程共享方式 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都 ...

  5. Tensorflow官方文档中文版——第一章

    第一示例: import tensorflow as tf import numpy as np x_data=np.float32(np.random.rand(,))#随机输入 y_data=np ...

  6. python基础17 ---继承补充知识

    一.继承的顺序 1.在python中的类可以集成多个类,既然是继承多个类就有类的寻找顺序这么一说.其寻找方法就有广度优先和深度优先两种. 2.当类是新式类,多继承的情况下会按照广度优先的顺序查找. 如 ...

  7. 图片加载控件Fresco

    使用教程:https://www.fresco-cn.org/docs/index.html  https://github.com/facebook/fresco application初始化fre ...

  8. 每天一个Linux命令(14)head命令

    head命令用于显示文件的开头的内容.在默认情况下,head命令显示文件的头10行内容.    如果指定了多于一个文件,在每一段输出前会给出文件名作为文件头. 如果不指定文件,或者文件为"- ...

  9. ubuntu14.04 spring cloud config server + gradle搭建

    Server端:在eclipse上,创建Java Project项目.自带的src包删掉手动建文件夹.基础的目录文件都创建上 |--ZSpringCloud|--build.gradle|----sr ...

  10. Effective java -- 9 并发/序列化

    关于同步的问题,想弄明白java,同步不会是不行的.这不书弄完后还会从<java并发编程实战>和<java并发编程的艺术>选一本或者都看. 第六十六条:同步访问共享的可变数据说 ...