基于JDK7,监控某文件夹拷贝文件,监控本身很简单用WatcherService实现,主要是如何确定文件拷贝完成,这里使用File的rename方法,提供一个思路
?
import java.io.File; import java.io.IOException; import java.nio.file.*; import static java.nio.file.StandardWatchEventKinds.*; /** * JDK7 NIO2 文件监控 */ public class MyWatcherService { public static void main(String[] args) throws IOException, InterruptedException { String dir = "C:\\Users\\Administrator\\Desktop\\test"; Path path = Paths.get(dir); WatchService watcher = FileSystems.getDefault().newWatchService(); path.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); while (true) { /** * 拷贝文件会触发 一次ENTRY_CREATE 两次ENTRY_MODIFY(文件可能只触发一次ENTRY_MODIFY) * 拷贝文件会触发 一次ENTRY_CREATE 两次ENTRY_MODIFY 一次ENTRY_DELETE * 删除文件会触发 一次ENTRY_DELETE */ WatchKey key = watcher.take(); for (WatchEvent<?> event : key.pollEvents()) { WatchEvent.Kind kind = event.kind(); // 事件可能lost or discarded if (kind == OVERFLOW) { System.out.println("事件可能lost or discarded"); continue; } WatchEvent<Path> e = (WatchEvent<Path>) event; String kindName = kind.name(); Path fileName = e.context(); System.out.printf("Event %s has happened,which fileName is %s%n", kindName, fileName); // 判断文件是否完成并进行下一步处理 if ("ENTRY_MODIFY".equals(kindName)) { rename(dir, fileName.toString()); } } // 重置 key 如果失败结束监控 if (!key.reset()) { break; } } } /** * 通过修改文件名判断文件拷贝完成 */ public static void rename(String dir, String fileName) { File file = new File(dir + File.separator + fileName); File file2 = new File("C:\\Users\\Administrator\\Desktop\\test2" + File.separator + fileName); file.renameTo(file2); if (file2.exists()) { System.out.printf("file %s copy over , you can do next with %s%n", file.getAbsolutePath(), file2.getAbsolutePath()); } } }
?
原文:http://sgq0085.iteye.com/blog/2190975