Java中的目录扫描程序

连续扫描一组目录以获取一组文件名filter。 对于到达的每个文件名filter,处理文件并重复所有步骤

在jdk 1.5中可能推荐的设计是什么,可能使用java.concurrent.Executor和Future

我已经使用网络爬虫做了类似的任务。只需要进行一些更改……这是一个并发实现,新发现的目录被Executor Framework中的线程池扫描。它使用队列和列表的并发集合保存索引文件。 索引器从队列中获取文件并对它们执行某些操作。 这是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; } } 

这里是主要方法的类…

 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. 你有一套dirs:

    DIR1
    DIR2
    DIR3

  2. 并且您需要在这3个目录上放置一个“监视”以获取特定的文件名模式。 示例:如果添加了一个名为: watchme_9192.log的新文件,那么您应该启动java逻辑并处理该文件。

因此,基于该假设,您可以尝试: jnotify

JNotify是一个java库,允许java应用程序监听文件系统事件,例如:
文件已创建
文件已修改
文件已重命名
文件已删除

此外,相关: 目录轮询的最佳实践