zoukankan      html  css  js  c++  java
  • 【监听文件 多线程】使用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包含了文件的创建/删除/修改各种事件。

  • 相关阅读:
    UNIX 高手的另外 10 个习惯
    python中的cls到底指的是什么
    一篇文章搞懂Python装饰器所有用法
    sysbench 压测
    python面向对象进阶
    python 学生表
    搞懂蓝绿发布、灰度发布和滚动发布
    数据库之视图、索引
    Java内存模型(JMM)以及 垃圾回收机制 小结
    Java线程唤醒与阻塞
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/6214921.html
Copyright © 2011-2022 走看看