2012-10-13 51 views
3

爲一組文件名過濾器連續掃描一組目錄。 對於每個文件名過濾器到達,工藝文件,重複上述步驟爲所有Java中的目錄掃描器

有什麼可以推薦的設計,這在JDK 1.5中,可能使用java.concurrent.Executor和未來

+0

那麼,它是否像java代碼將在dir上執行的定期掃描? – zengr

回答

1

我已經做了與Web類似的任務crawler.Just一些變化必須作出......這是新近發現的一個目錄並實現過得去的線程池掃描執行器框架。它使用併發集合的隊列和列表來保存索引文件。索引器從隊列中拾取文件並對它們執行某些操作。 這裏是一個FileFilter實施



    public class ImageFileFilter implements FileFilter 
    { 
     private final String[] okFileExtensions = 
     new String[] {"jpg", "png", "gif"}; 

     public boolean accept(File file) 
     { 
     for (String extension : okFileExtensions) 
     { 
      if (file.getName().toLowerCase().endsWith(extension)) 
      { 
      return true; 
      } 
     } 
     return false; 
     } 
    } 

這裏是main方法的類...




    public class FileFilterTest { 
     public static void main(String[] args) { 
      File dir = new File("D:\\dev\\css-templates\\cms-admin"); 
      BlockingQueue blockingQueue = new ArrayBlockingQueue(5); 
      FileCrawler fileCrawler = new FileCrawler(blockingQueue, 
        new ImageFileFilter(), dir); 
      new Thread(fileCrawler).start(); 

      FileIndexer indexer = new FileIndexer(blockingQueue); 
      new Thread(indexer).start(); 
     } 
    } 

這裏是文件履帶線程




    public class FileCrawler implements Runnable { 
      private final BlockingQueue fileQueue; 
      private ConcurrentSkipListSet indexedFiles = new ConcurrentSkipListSet(); 
      private final FileFilter fileFilter; 
      private final File root; 
      private final ExecutorService exec = Executors.newCachedThreadPool(); 

      public FileCrawler(BlockingQueue fileQueue, 
           final FileFilter fileFilter, 
           File root) { 
       this.fileQueue = fileQueue; 
       this.root = root; 
       this.fileFilter = new FileFilter() { 
        public boolean accept(File f) { 
         return f.isDirectory() || fileFilter.accept(f); 
        } 
       }; 
      } 

      public void run() { 

        submitCrawlTask(root); 

      } 

      private void submitCrawlTask(File f) { 
       CrawlTask crawlTask = new CrawlTask(f); 
       exec.execute(crawlTask); 
      } 

      private class CrawlTask implements Runnable { 
       private final File file; 

       CrawlTask(File file) { 

        this.file= file; 
       } 

      public void run() {   
       if(Thread.currentThread().isInterrupted()) 
       return; 

        File[] entries = file.listFiles(fileFilter); 

        if (entries != null) { 
         for (File entry : entries) 
          if (entry.isDirectory()) 
           submitCrawlTask(entry); 
          else if (entry !=null && !indexedFiles.contains(entry)){ 
           indexedFiles.add(entry); 
           try { 
            fileQueue.put(entry); 
           } catch (InterruptedException e) { 
             Thread.currentThread().interrupt(); 
           } 
          } 
        } 
       } 
     } 
     } 

這裏是文件索引線程



     public class FileIndexer implements Runnable { 
     private final BlockingQueue queue; 

     public FileIndexer(BlockingQueue queue) { 
      this.queue = queue; 
     } 

     public void run() { 
      try { 
       while (true) { 
        indexFile(queue.take()); 
       } 
      } catch (InterruptedException e) { 
       System.out.println("Indexer Interrupted"); 
       Thread.currentThread().interrupt(); 
      } 
     } 

     public void indexFile(File file) { 
      // do something with the file... 
      System.out.println("Indexing File : " + file.getAbsolutePath() + " " + file.getName()); 
     }; 
    } 

1

我想這是你正在嘗試做的事:

  1. 你有一組迪爾斯的:

    DIR1
    DIR2
    個 DIR3

  2. 而你需要放置在這3個目錄中的特定文件名模式「觀看」。 例如:如果一個新文件被添加了名稱:watchme_9192.log,那麼您的java邏輯應該啓動並處理該文件。

因此,基於這種假設,你可以嘗試:jnotify

JNotify是一個Java庫,允許Java應用程序來聽 文件系統事件,如:
文件創建
文件修改
文件改名爲
文件刪除

此外,相關:best practice for directory polling

+0

感謝您的回覆。我不允許爲這個實現添加新的庫,否則jnotify是不錯的選擇。我正在檢查提供的第一個實施以符合我的需求。 – fortm