zoukankan      html  css  js  c++  java
  • java 监听文件或文件夹变化

        今天遇到一个新需求,当从服务器下载文件后用指定的本地程序打开,不知道何时文件下载完成,只能考虑监听文件夹,当有新文件创建的时候打开指定程序。

    在此给出一个完整的下载和打开过程:

    1、下载文件

    jsp页面

    1 <body>
    2     <div>
    3         <a href="<%=basePath%>/user/downLoadFile?fileName=proPlan.DWG" >点击下载</a>
    4     </div>
    5 </body>

    java代码

     1  public static void downLoadtFile(HttpServletResponse response, File file) throws IOException
     2     {
     3         response.reset();
     4         response.setContentType("application/vnd.ms-excel;charset=UTF-8");
     5         response.setHeader("Content-disposition",
     6                 "attachment; filename=" + new String(file.getName().getBytes(), "iso-8859-1"));
     7         OutputStream outputStream = response.getOutputStream();
     8         InputStream in = new FileInputStream(file);
     9         byte[] b = new byte[1024];
    10         int len = 0;
    11         while ((len = in.read(b)) > 0)
    12         {
    13             outputStream.write(b, 0, len);
    14         }
    15         outputStream.write(b);
    16         outputStream.flush();
    17         in.close();
    18     }

    2、监听文件夹,执行打开程序

     1 package demo;
     2 
     3 import java.io.IOException;
     4 import java.nio.file.FileSystems;
     5 import java.nio.file.Path;
     6 import java.nio.file.Paths;
     7 import java.nio.file.StandardWatchEventKinds;
     8 import java.nio.file.WatchEvent;
     9 import java.nio.file.WatchKey;
    10 import java.nio.file.WatchService;
    11 import java.util.List;
    12 import java.util.concurrent.ExecutorService;
    13 import java.util.concurrent.Executors;
    14 
    15 public class FolderListener {
    16     private static ExecutorService fixedThreadPool = Executors.newCachedThreadPool();
    17     private WatchService ws;
    18     private String listenerPath;
    19     private FolderListener(String path) {
    20         try {
    21             ws = FileSystems.getDefault().newWatchService();
    22             this.listenerPath = path;
    23             start();
    24         } catch (IOException e) {
    25             e.printStackTrace();
    26         }
    27     }
    28 
    29     private void start() {
    30         fixedThreadPool.execute(new Listner(ws,this.listenerPath));
    31     }
    32 
    33     public static void addListener(String path) throws IOException {
    34         FolderListener resourceListener = new FolderListener(path);
    35         Path p = Paths.get(path);
    36         //注册监听事件,文件的修改、删除和创建
    37         p.register(resourceListener.ws,
    38             StandardWatchEventKinds.ENTRY_MODIFY,
    39             StandardWatchEventKinds.ENTRY_DELETE,
    40             StandardWatchEventKinds.ENTRY_CREATE);
    41     }
    42     
    43 
    44     public static void main(String[] args) throws IOException {
    45         //监听下载目录的变化
    46         FolderListener.addListener("C:\Users\Administrator\Downloads\");
    47     }
    48 }
    49 
    50 class Listner implements Runnable {
    51     private WatchService service;
    52     private String rootPath;
    53     
    54     public Listner(WatchService service,String rootPath) {
    55         this.service = service;
    56         this.rootPath = rootPath;
    57     }
    58 
    59     public void run() {
    60         try {
    61             while(true){
    62                 WatchKey watchKey = service.take();
    63                 List<WatchEvent<?>> watchEvents = watchKey.pollEvents();
    64                 for(WatchEvent<?> event : watchEvents){
    65                     if(event.context().toString().endsWith(".DWG"))
    66                     // 根据事件类型采取不同的操作。。。。。。。
    67                     try {
    68                         System.out.println("["+rootPath+event.context()+"]文件发生了["+event.kind()+"]事件"+    event.count());  
    69                         String[] cmd = { "D:\cad\AutoCAD\acad.exe", "C:\Users\Administrator\Downloads\" + event.context().toString() };
    70                         Runtime.getRuntime().exec(cmd);
    71                     } catch (IOException e) {
    72                         e.printStackTrace();
    73                     }
    74                 }
    75                 watchKey.reset();
    76             }
    77         } catch (InterruptedException e) {
    78             e.printStackTrace();
    79         }finally{
    80             System.out.println("fdsfsdf");
    81             try {
    82                 service.close();
    83             } catch (IOException e) {
    84                 e.printStackTrace();
    85             }
    86         }
    87         
    88     }
    89 }
    View Code

    补充,除了执行指定exe,打开软件外还可以执行命令行

     1 package demo;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.InputStream;
     5 import java.io.InputStreamReader;  
     6   
     7 public class Command {  
     8     
     9     public static void main(String[] args) {
    10         String s = exeCmd("ipconfig");
    11         System.out.println(s);
    12     }
    13     
    14     public static String exeCmd(String commandStr) {  
    15         BufferedReader br = null;  
    16         StringBuilder sb = new StringBuilder(); 
    17         try {  
    18             Process p = Runtime.getRuntime().exec(commandStr);  
    19             br = new BufferedReader(new InputStreamReader(p.getInputStream(), "gb2312"));
    20 //            InputStream in = p.getInputStream();
    21 //            byte[] b = new byte[1024];
    22 //            int len = 0;
    23 //            while((len = in.read(b)) > 0){
    24 //                sb.append(new String(b,"gb2312")).append("
    ");
    25 //            }
    26             String line = null;  
    27             while ((line = br.readLine()) != null) {  
    28                 sb.append(line).append("
    ");  
    29             }  
    30         } catch (Exception e) {  
    31             e.printStackTrace();  
    32         }   
    33         finally  
    34         {  
    35             if (br != null)  
    36             {  
    37                 try {  
    38                     br.close();  
    39                 } catch (Exception e) {  
    40                     e.printStackTrace();  
    41                 }  
    42             }  
    43         }  
    44         return sb.toString();
    45     }  
    46 }  
  • 相关阅读:
    [PKUSC2018]星际穿越——可持久化线段树+DP
    BZOJ2863[SHOI2012]魔法树——树链剖分+线段树
    BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
    BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
    树链剖分讲解及总结(重链剖分+长链剖分)
    Dubbo(3)--dubbo的源码分析
    Dubbo(1)--初识Dubbo
    zookeeper(5)--基于watcher原理实现带注册中心的RPC框架
    模板方法模式
    单例模式
  • 原文地址:https://www.cnblogs.com/xxjcai/p/11586559.html
Copyright © 2011-2022 走看看