• 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 }  
  • 相关阅读:
    Truck History(poj 1789)
    Highways poj 2485
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    115. Distinct Subsequences
    114. Flatten Binary Tree to Linked List
    113. Path Sum II
    109. Convert Sorted List to Binary Search Tree
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
  • 原文地址:https://www.cnblogs.com/xxjcai/p/11586559.html
Copyright © 2020-2023  润新知