【监听文件 多线程】使用java--WatchService监听文件 开启多线程copy文件

有一个小需求:

在PC跟前没有人的时候,迅雷下载文件 至PC磁盘上,并且自动移动文件到U盘上,小主只要在走的时候取走U盘即可。

基于这个需求,有了下面这段代码:【JDK  1.8】

 1 package com.sxd.moveFile;
 2
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.File;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 import java.nio.file.Path;
 9 import java.nio.file.Paths;
10 import java.nio.file.StandardWatchEventKinds;
11 import java.nio.file.WatchKey;
12 import java.nio.file.WatchService;
13 import java.util.concurrent.TimeUnit;
14
15 import org.junit.Test;
16
17 import com.google.common.io.Files;
18
19 /**
20  * 监听某个文件夹下--如果有新的文件出现 则移动文件到指定目录下
21  * @author Administrator
22  *
23  */
24 public class MoveFile implements Runnable{
25
26     public static String fileName = null;
27
28     @Test
29     public void test() throws IOException, InterruptedException{
30         moveFile();
31     }
32
33     public void moveFile() throws IOException, InterruptedException{
34
35
36             final Path path = Paths.get("E:/迅雷下载");
37             final WatchService watchService = path.getFileSystem().newWatchService();
38             path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);//创建并启动监听 --创建文件的事件
39
40 //            final WatchKey watchKey = watchService.poll(20, TimeUnit.MINUTES);//poll()监听停止的条件--持续20分钟 20分钟后关闭监听
41             final WatchKey  watchKey = watchService.take();//take()等不到此类事件发生就一直运行
42
43             if(watchKey != null) {
44                 watchKey.pollEvents().stream().forEach(event ->
45                 {
46                     //执行本次 触发后的方法体
47                     System.out.println(event.context());System.out.println(event.kind().name());
48                     //仅 判断 新创建文件后缀为.rmvb的   才进行如下 操作
49                     if(event.context().toString().substring(event.context().toString().lastIndexOf(".")).equals(".rmvb")  || event.context().toString().substring(event.context().toString().lastIndexOf(".")).equals(".mkv")){
50                         fileName = event.context().toString();
51
52                         MoveFile mf = new MoveFile();
53                         Thread thread1 = new Thread(mf);//开启一个新的线程
54                         thread1.start();
55                     }
56                 });
57                 //再次执行
58                 try {
59                     moveFile();
60                 } catch (Exception e1) {
61                     e1.printStackTrace();
62                 }
63
64             }
65
66     }
67
68     @Override
69     public void run() {
70         try {
71             Files.copy(new File("E:/迅雷下载/"+fileName), new File("J:/U盘/迅雷下载/"+fileName));
72         } catch (Exception e) {
73             e.printStackTrace();
74         }
75     }
76 }

View Code

 

 

其中 关于文件系统注册的监听器上,有监听事件类型:

Overflow包含了文件的创建/删除/修改各种事件。

 

时间: 2024-10-23 06:34:53

【监听文件 多线程】使用java--WatchService监听文件 开启多线程copy文件的相关文章

matlab m文件构建成Java 报错不知道是什么错误

问题描述 matlab m文件构建成Java 报错不知道是什么错误 m文件内容是: function [sum] = oper(a,b); sum = a + b; end 出错的错误是: 正在构造 Javadoc 信息... 标准 Doclet 版本 1.8.0_40 正在构建所有程序包和类的树... 正在生成C:UsersAdministratorDocumentsMATLABoperfor_testingdochtmloperClass1.html... C:UsersAdministra

使用xmlhttp和Java session监听改善站内消息系统

session|xml 使用xmlhttp和Java session监听改善站内消息系统 bromon 原创  引自:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=25340 这个题目含有许多需要解释的概念,最容易说明的是"站内消息",这是很多论坛都有的功能,可以通过web向其他的在线用户发送消息,很多用户都使用过.站内消息的第一个好处是大家都不需要安装客户端,你不用知道对方的MSN或

xmlhttp和Java session监听改善消息系统

session|xml 这个题目含有许多需要解释的概念,最容易说明的是"站内消息",这是很多论坛都有的功能,可以通过web向其他的在线用户发送消息,很多用户都使用过.站内消息的第一个好处是大家都不需要安装客户端,你不用知道对方的MSN或者QQ,就能与他联系,称赞他的观点或者是给他一顿臭骂. 第二个好处是客户管理方便,利用session来维护在线名单,各种脚本都已经把session操作封装得很易用了,不用像其他无状态的即时通信工具(比如使用UDP通信的工具)一样,要费一些脑细胞来解决在线

用xmlhttp和Java session监听改善站内消息系统

session|xml 原文出处:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=25340 这个题目含有许多需要解释的概念,最容易说明的是"站内消息",这是很多论坛都有的功能,可以通过web向其他的在线用户发送消息,很多用户都使用过.站内消息的第一个好处是大家都不需要安装客户端,你不用知道对方的MSN或者QQ,就能与他联系,称赞他的观点或者是给他一顿臭骂.第二个好处是客户管理方便,利用

JAVA键盘监听,错误在哪里

问题描述 JAVA键盘监听,错误在哪里 解决方案 java 键盘监听java 键盘监听Java:键盘全局监听 解决方案二: http://zhidao.baidu.com/question/577201357.html?qbl=relate_question_0 解决方案三: 编译问题,你这个方法调用参数类型是错误的,键盘监听事件的参数是addKeyListener的参数必须是实现KeyListener这个接口的类. 你的mb类型定义的是JPanel,所以会报编译错误.你需要定义一个类实现Key

java如何监听打印机的内容

问题描述 java如何监听打印机的内容 需求是这样的,想在打印机打印小票之前捕捉小票内容,然后修改小票内容再打印.跪求大神们提供代码,文档,思路等信息,谢谢了 解决方案 我也想知道啊 哪位大神指点一下 解决方案二: java没法做系统一级的,需要c cpp然后给java调用.

事件处理-新手求教大神,java事件监听问题

问题描述 新手求教大神,java事件监听问题 import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JLabel; public class EventModelDemo implements ActionListener{ JLabel tips=new

java中监听接口里面的onclick方法为什么被称为回调方法

问题描述 java中监听接口里面的onclick方法为什么被称为回调方法 那普通接口有回调方法吗,普通类有回调方法吗, 回调方法是如何定义的 解决方案 你别被回调这个词搞蒙了,其实就是把方法当做参数而已 解决方案二: 因为onclick你定义了,不是自己调用,而是间接由按钮点击后系统类库去调用,所以叫回调. 英文叫做callback. 解决方案三: 回调方法简单的说就是a方法都用b方法,b方法执行过程中需要调用a方法,callback 解决方案四: [个人向]Android回调接口的实现方法ja

关于java事件监听的问题

问题描述 关于java事件监听的问题 有个登陆按钮 点击后登陆 我想得是按下回车键登陆 但是为什么不能在按键事件监听中调用那个点击事件那 解决方案 java事件监听监听事件问题JAVA监听键盘事件 解决方案二: 给那个按钮设个快捷键,让它在按下回车的时候触发监听事件 解决方案三: 提交按钮和enter按键的功能一样,只是一个是click事件,enter是keypress事件. 解决方案四: 可以在相应的设置中设置为快捷键,然后调用.或者设置shift顺序,调用doClick方法,差不多就是这样了