欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从ftp根据子目录名(按日期+时间)更新文件(原创)

程序员文章站 2022-05-11 22:13:47
...
情景是这样的:每天会发布到ftp服务器上以当天日期加时间的目录,下面存有要插入数据库的文件,  定时任务里 要去判断 ftp上是否有需要更新的数据文件 有则从ftp下载到本地 并把本地旧文件删除

这也许很简单,但是是我自己一个单词一个的打过来的,只想记录一下。
package com.ce.ftp;

import it.sauronsoftware.ftp4j.FTPAbortedException;
import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPDataTransferException;
import it.sauronsoftware.ftp4j.FTPException;
import it.sauronsoftware.ftp4j.FTPFile;
import it.sauronsoftware.ftp4j.FTPIllegalReplyException;
import it.sauronsoftware.ftp4j.FTPListParseException;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import com.ce.util.CommonStringDateUtil;
import com.ce.util.PropertiesUtil;

/**

* @author faithlee
*
*/
public class FtpTool {

private static FTPClient client = new FTPClient();

/**
* 连接且登录到特定的FTP服务器文件夹
*
* @return
* @throws FTPException
* @throws FTPIllegalReplyException
* @throws IOException
* @throws IllegalStateException
*/
public boolean connectToServer(PropertiesUtil pro, String filename)
throws IllegalStateException, IOException,
FTPIllegalReplyException, FTPException {


String server = pro.getValue(filename, "ftp.ip");
String user = pro.getValue(filename, "ftp.user");
String password = pro.getValue(filename, "ftp.password");
String path = pro.getValue(filename, "ftp.path");

client.connect(server);
client.login(user, password);
System.out.println("连接ftp服务器成功");

client.changeDirectory(path);

if (client.isCompressionSupported()) {
client.setCompressionEnabled(true);
}
return true;
}

/**
*   判断是否有新的数据文件下载
* @param path
* @param localpath
* @param date
* @param remoteDirMap
* @param localDirMap
* @return
* @throws IllegalStateException
* @throws IOException
* @throws FTPIllegalReplyException
* @throws FTPException
* @throws FTPDataTransferException
* @throws FTPAbortedException
* @throws FTPListParseException
*/
public boolean doUpdate(String ftppath, String localpath, String date)
throws IllegalStateException, IOException,
FTPIllegalReplyException, FTPException, FTPDataTransferException,
FTPAbortedException, FTPListParseException {
Boolean bl = false;
Map<String, FileObject> remoteFileMap = new HashMap<String, FileObject>();
Map<String,String> localDirMap = new HashMap<String,String>();
Map<String,String> remoteDirMap = new HashMap<String,String>();

remoteDirMap = getRemoteDir();
localDirMap = getLocalDir(localpath);

if (!remoteDirMap.isEmpty() && localDirMap.isEmpty()) {
System.out.println("本地为空,需要导入数据");
System.out.println("下载需要更新的数据文件...");
Set<Entry<String, String>> fileEntrySet = remoteDirMap.entrySet();
String dirname = "";
int n = 1;
for (Entry<String, String> entry : fileEntrySet) {

dirname = entry.getValue();
System.out.println("下载"+dirname+"的数据");
if (n == 1) {
client.changeDirectory(dirname);
} else {
client.changeDirectoryUp();
client.changeDirectory(dirname);
}
remoteFileMap = getRemotefiles();
String localdir = localpath + dirname;
File f = new File(localdir);
if (!f.exists()) {
f.mkdirs();
}

for (String filename : remoteFileMap.keySet()) {

client.download(filename, new File(localdir + "/"
+ filename));
}
n++;
}
System.out.println("下载完成");
bl = true;
} else {

if (remoteDirMap.containsKey(date)
&& !localDirMap.containsKey(remoteDirMap.get(date))) {
System.out.println("有新数据需要导入");

for(String localdirpath : localDirMap.values()){
System.gc();
deleteDirectory(localdirpath);
}

System.out.println("删除成功");
String dir = remoteDirMap.get(date);
String remoteDir = ftppath + dir;
client.changeDirectory(remoteDir);
remoteFileMap = getRemotefiles();
String localdir = localpath + dir;
File f = new File(localdir);
if (!f.exists()) {
f.mkdirs();
}
System.out.println("下载需要更新的数据文件...");
System.out.println("下载"+dir+"的数据");

for (String filename : remoteFileMap.keySet()) {
// System.out.println(filename);

client.download(filename, new File(localdir + "/"
+ filename));
}
System.out.println("下载文件完成");
bl = true;

} else {
System.out.println("没有新的数据文件需要更新");
bl = false;
}

}
return bl;
}

/**
*  获取远程文件信息
* @return
* @throws IllegalStateException
* @throws IOException
* @throws FTPIllegalReplyException
* @throws FTPException
* @throws FTPDataTransferException
* @throws FTPAbortedException
* @throws FTPListParseException
*/
public Map<String, FileObject> getRemotefiles()
throws IllegalStateException, IOException,
FTPIllegalReplyException, FTPException, FTPDataTransferException,
FTPAbortedException, FTPListParseException {
FTPFile[] remotefiles = client.list();
Map<String, FileObject> rtn = new HashMap<String, FileObject>();
for (FTPFile file : remotefiles) {
if (".".equals(file.getName()) || "..".equals(file.getName())) {
continue;
}
FileObject fo = new FileObject();
fo.filename = file.getName();
fo.lasttime = CommonStringDateUtil.format(file.getModifiedDate());
rtn.put(fo.filename, fo);
}
return rtn;
}

/**
*  获取远程目录信息
* @return
* @throws IllegalStateException
* @throws IOException
* @throws FTPIllegalReplyException
* @throws FTPException
* @throws FTPDataTransferException
* @throws FTPAbortedException
* @throws FTPListParseException
*/
public Map<String, String> getRemoteDir() throws IllegalStateException,
IOException, FTPIllegalReplyException, FTPException,
FTPDataTransferException, FTPAbortedException,
FTPListParseException {
Map<String, String> remoteDirName = new HashMap<String, String>();

FTPFile[] list = client.list();

for (int i = 0; i < list.length; i++) {
FTPFile file = list[i];
if (file.getType() == FTPFile.TYPE_DIRECTORY) {
String name = list[i].getName();

String dirDate = name.substring(0, name.length() - 2);
remoteDirName.put(dirDate, name);
}
}
return remoteDirName;
}
/**
*  获取本地目录信息
* @param localpath
* @return
*/
public  Map<String, String> getLocalDir(String localpath) {

Map<String, String> localDirName = new HashMap<String, String>();
File f = new File(localpath);
if (!f.exists()) {
System.out.println("目录不存在,创建目录");
f.mkdirs();
}
File[] ff = f.listFiles();

for (int i = 0; i < ff.length; i++) {
if (ff[i].isDirectory()) {
String name = ff[i].getName();
String path = ff[i].getPath();
localDirName.put(name, path);
}
}
return localDirName;
}

/**
*  删除目录
* @param localpath
*/
private void deleteDirectory(String path){
  File f = new File(path);
  if(!f.exists()){
   System.out.println("not exists");
   return;
  }
  if(f.delete()){
   System.out.println("delete directory : "+f.getAbsolutePath());
  }else{
   File[] fs = f.listFiles();
   for(int i=0;i<fs.length;i++){
    if(fs[i].isDirectory()){
     if(!fs[i].delete())deleteDirectory(fs[i].getAbsolutePath());
     else System.out.println("刪除目录 directory : "+fs[i].getAbsolutePath());
    }else{
     fs[i].delete();
    
    }
   }
   f.delete();
  
  }
  System.out.println("删除完成");
}

public void close() throws IllegalStateException, IOException,
FTPIllegalReplyException, FTPException {

client.disconnect(true);

}

}

class FileObject {
String filename;
String lasttime;

@Override
public String toString() {
return filename + "|" + lasttime;
}
}