手写的嵌入式服务器想增加热部署功能,主要是一些静态文件。所以做了这个尝试。
原理是用定时任务每隔一段时间查看文件修改日期,和上一次进行比较,如果不相同,则同步文件到目标地址。
MonitorTask.java
package com.shy.code;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.TimerTask;
/**
* 定时任务类
*/
public class MonitorTask extends TimerTask {
private File[] files;//要监听的文件列表
private Map<File,Long> modifyTimeMap = new HashMap<>();
private File destDir;//目标文件目录
/**
* @param srcDir 源文件目录
* @param destDir 目标文件目录
*/
public MonitorTask(File srcDir,File destDir) {
this.destDir = destDir;
files = srcDir.listFiles();
assert files != null;
for (File file : files) {
modifyTimeMap.put(file,file.lastModified());
Util.copyFile(file,destDir);
}
}
/**
* 执行定时任务
*/
@Override
public void run() {
assert files != null;
for (File file : files) {
long lastModified = file.lastModified();
if(lastModified != modifyTimeMap.get(file)) {//比较文件修改时间和map中的修改时间
System.out.println(file.getName()+"修改了");
Util.copyFile(file,destDir);//同步修改过的文件
modifyTimeMap.put(file,lastModified);//更新map中的记录
}
}
}
}
Util.java
package com.shy.code;
import java.io.*;
public class Util {
/**
* 复制文件
* @param srcFile 源文件
* @param destDir 目标文件路径
*/
public static void copyFile(File srcFile, File destDir){
try {
File destFile = new File(destDir,srcFile.getName());
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(srcFile));
BufferedOutputStream bot = new BufferedOutputStream(new FileOutputStream(destFile));
int len;
byte[] bt = new byte[1024];
while((len = bin.read(bt)) != -1) {
bot.write(bt,0,len);
}
bot.close();
bin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Demo.java
package com.shy.code;
import java.io.*;
import java.util.Timer;
import java.util.TimerTask;
public class Demo {
public static void main(String[] args) throws UnsupportedEncodingException {
File src = new File("C:\\src");
File dest = new File("C:\\dest");
Timer timer = new Timer(true);//true,设为守护线程
TimerTask timerTask = new MonitorTask(src,dest);
timer.schedule(timerTask, 0,1000);//每隔1s执行
}
}