1.目录监听
package com.example.file_sync.utils;
import com.sun.istack.internal.logging.Logger;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import java.io.File;
/**
* @title: FileListener
* @projectName file_sync
* @Date: 2021/7/22 9:53
* @Author: lei.yu-esint
* @Description:
*/
public class FileListener extends FileAlterationListenerAdaptor {
private Logger log = Logger.getLogger(FileListener.class);
/**
* 文件创建执行
*/
@Override
public void onFileCreate(File file) {
log.info("[新建]:" + file.getAbsolutePath());
}
/**
* 文件创建修改
*/
@Override
public void onFileChange(File file) {
log.info("[修改]:" + file.getAbsolutePath());
}
/**
* 文件删除
*/
@Override
public void onFileDelete(File file) {
log.info("[删除]:" + file.getAbsolutePath());
}
/**
* 目录创建
*/
@Override
public void onDirectoryCreate(File directory) {
log.info("[新建]:" + directory.getAbsolutePath());
}
/**
* 目录修改
*/
@Override
public void onDirectoryChange(File directory) {
log.info("[修改]:" + directory.getAbsolutePath());
}
/**
* 目录删除
*/
@Override
public void onDirectoryDelete(File directory) {
log.info("[删除]:" + directory.getAbsolutePath());
}
@Override
public void onStart(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super.onStart(observer);
}
@Override
public void onStop(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super.onStop(observer);
}
}
2.模拟调用
package com.example.file_sync;
import com.example.file_sync.utils.FileListener;
import com.example.file_sync.utils.PostRequest;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@SpringBootApplication
public class FileSyncApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(FileSyncApplication.class, args);
//文件开始同步
doFileSunc();
/**
* 文件数:110,515
* 文件夹大小:2.4G
* 每轮遍历时间:2分30秒
*
* 所以如果每秒进行遍历的话,最大同步时间是:遍历时间X2 , 也就是五分钟
*/
}
//数据同步
private static void doFileSunc() throws Exception {
// 监控目录
String rootDir = "F:\\ES";
// 轮询间隔 5 秒
long interval = TimeUnit.SECONDS.toMillis(1);
// 创建过滤器,可以监听指定的文件
// IOFileFilter directories = FileFilterUtils.and(
// FileFilterUtils.directoryFileFilter(),
// HiddenFileFilter.VISIBLE);
// IOFileFilter files = FileFilterUtils.and(
// FileFilterUtils.fileFileFilter(),
// FileFilterUtils.suffixFileFilter(".txt"));
// IOFileFilter filter = FileFilterUtils.or(directories, files);
// 使用过滤器
// FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir), filter);
//不使用过滤器,监听目录下的全部类型的文件
FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
observer.addListener(new FileListener());
//创建文件变化监听器
FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
// 开始监控
monitor.start();
}
}
3.通过监听文件夹、上传文件到指定服务器实现的文件同步
3.1 项目结构(spring boot 2.1.5)
下面是各个代码:
controller
package com.example.file_sync.controller;
import com.alibaba.fastjson.JSONObject;
import com.example.file_sync.utils.FileListener;
import com.example.file_sync.utils.PostRequest;
import com.sun.istack.internal.logging.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
/**
* @title: FileSyncController
* @projectName file_sync
* @Date: 2021/7/22 14:13
* @Author: lei.yu-esint
* @Description:
*/
@RestController
public class FileSyncController {
private Logger log = Logger.getLogger(FileListener.class);
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public void uploadFile(HttpServletRequest request, HttpServletResponse response) {
String fileName = request.getParameter("fileName");
log.info("filename:"+fileName);
String fileFullPath = "F:/ES/aaa/" + fileName;
InputStream input = null;
FileOutputStream fos = null;
try {
input = request.getInputStream();
File file = new File("F:/ES/aaa/");
if(!file.exists()){
file.mkdirs();
}
fos = new FileOutputStream(fileFullPath);
int size = 0;
byte[] buffer = new byte[1024];
while ((size = input.read(buffer,0,1024)) != -1) {
fos.write(buffer, 0, size);
}
//响应信息 json字符串格式
Map<String,Object> responseMap = new HashMap<String,Object>();
responseMap.put("flag", true);
//生成响应的json字符串
String jsonResponse = JSONObject.toJSONString(responseMap);
PostRequest.sendResponse(jsonResponse,response);
} catch (IOException e) {
//响应信息 json字符串格式
Map<String,Object> responseMap = new HashMap<String,Object>();
responseMap.put("flag", false);
responseMap.put("errorMsg", e.getMessage());
String jsonResponse = JSONObject.toJSONString(responseMap);
// PostRequest.sendResponse(jsonResponse,response);
} catch (Exception e) {
e.printStackTrace();
} finally{
if(input != null){
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@RequestMapping("/doUploadFile")
public void douploadFile() {
//模拟发送数据
String pathName = "F:/ES/aaa/1.txt";
String fileName="1.txt";
try {
PostRequest.uploadFile(pathName,fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
}
FileListener
package com.example.file_sync.utils;
import com.sun.istack.internal.logging.Logger;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import java.io.File;
/**
* @title: FileListener
* @projectName file_sync
* @Date: 2021/7/22 9:53
* @Author: lei.yu-esint
* @Description:
*/
public class FileListener extends FileAlterationListenerAdaptor {
private Logger log = Logger.getLogger(FileListener.class);
/**
* 文件创建执行
*/
@Override
public void onFileCreate(File file) {
log.info("[新建]:" + file.getAbsolutePath());
}
/**
* 文件创建修改
*/
@Override
public void onFileChange(File file) {
log.info("[修改]:" + file.getAbsolutePath());
}
/**
* 文件删除
*/
@Override
public void onFileDelete(File file) {
log.info("[删除]:" + file.getAbsolutePath());
}
/**
* 目录创建
*/
@Override
public void onDirectoryCreate(File directory) {
log.info("[新建]:" + directory.getAbsolutePath());
}
/**
* 目录修改
*/
@Override
public void onDirectoryChange(File directory) {
log.info("[修改]:" + directory.getAbsolutePath());
}
/**
* 目录删除
*/
@Override
public void onDirectoryDelete(File directory) {
log.info("[删除]:" + directory.getAbsolutePath());
}
@Override
public void onStart(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super.onStart(observer);
}
@Override
public void onStop(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super.onStop(observer);
}
}
package com.example.file_sync.utils;
import com.alibaba.fastjson.JSONObject;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.FileInputStream;
/**
* @title: PostRequest
* @projectName file_sync
* @Date: 2021/7/22 15:19
* @Author: lei.yu-esint
* @Description:
*/
public class PostRequest {
private static final String host = "http://localhost:8020";
private static final String doUrl = host + "/uploadFile";
String outFilePath = PropertiesUtil.readValue("params.properties", "fileUpload.decriptTest");
/**
* 模拟POST 上传文件
* @param pathName
* @param fileName
* @throws Exception
*/
public static void uploadFile(String pathName,String fileName) throws Exception {
DataInputStream in = null;
OutputStream out = null;
HttpURLConnection conn = null;
JSONObject resposeTxt = null;
InputStream ins = null;
ByteArrayOutputStream outStream = null;
try {
URL url = new URL(doUrl+"?fileName="+fileName);
conn = (HttpURLConnection) url.openConnection();
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "text/html");
conn.setRequestProperty("Cache-Control", "no-cache");
conn.setRequestProperty("Charsert", "UTF-8");
conn.connect();
conn.setConnectTimeout(10000);
out = conn.getOutputStream();
File file = new File(pathName);
in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] buffer = new byte[1024];
while ((bytes = in.read(buffer)) != -1) {
out.write(buffer, 0, bytes);
}
out.flush();
// 返回流
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
ins = conn.getInputStream();
outStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int count = -1;
while ((count = ins.read(data, 0, 1024)) != -1) {
outStream.write(data, 0, count);
}
data = null;
resposeTxt = JSONObject.parseObject(new String(outStream
.toByteArray(), "UTF-8"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
if (ins != null) {
ins.close();
}
if (outStream != null) {
outStream.close();
}
if (conn != null) {
conn.disconnect();
}
}
}
/**
* 返回响应
*
* @throws Exception
*/
public static void sendResponse(String responseString, HttpServletResponse response) throws Exception {
response.setContentType("application/json;charset=UTF-8");
PrintWriter pw = null;
try {
pw = response.getWriter();
pw.write(responseString);
pw.flush();
} finally {
IOUtils.closeQuietly(pw);
}
}
}
package com.example.file_sync.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;
public class PropertiesUtil {
//根据Key读取路径
public static String getPath(String fileName,String subFile){
String value = "";
InputStream in = null;
try {
in = PropertiesUtil.class.getClassLoader().getResourceAsStream(
fileName);
Properties props = new Properties();
props.load(in);
value = props.getProperty("fileUpload."+subFile);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return value;
}
// 根据key读取value
public static String readValue(String fileName, String key) {
String value = "";
InputStream in = null;
try {
in = PropertiesUtil.class.getClassLoader().getResourceAsStream(
fileName);
Properties props = new Properties();
props.load(in);
value = props.getProperty(key);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return value;
}
// 读取properties的全部信息
public static void readProperties(String fileName) {
Properties props = new Properties();
InputStream in = null;
try {
in = PropertiesUtil.class.getClassLoader().getResourceAsStream(
fileName);
props.load(in);
Enumeration<?> en = props.propertyNames();
while (en.hasMoreElements()) {
String key = (String) en.nextElement();
String property = props.getProperty(key);
System.out.println(key + "=" + property);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}