通过阻塞队列实现文件关键字检索功能
程序员文章站
2022-04-20 23:09:13
...
package com.queue; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Scanner; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; /** * 通过阻塞队列实现文件关键字检索功能 * * @author benDaoRong */ public class BlockQueueTest { public static void main(String[] args) { String path = "F:/个人资料/书籍/TXT&PDF"; String keyword = "农夫"; final int FILE_QUEUE_SIZE = 10;// 阻塞队列大小 final int SEARCH_THREADS = 100;// 关键字搜索线程个数 BlockingQueue<File> queue = new ArrayBlockingQueue<File>(FILE_QUEUE_SIZE); // 启动线程遍历文件 FileEnumerationTask enumeration = new FileEnumerationTask(queue, new File(path)); new Thread(enumeration).start(); // 启动线程检索关键字 for (int i = 0; i < SEARCH_THREADS; i++) { new Thread(new SearchTask(queue, keyword)).start(); } } } class FileEnumerationTask implements Runnable { // 哑元文件对象,放在阻塞队列最后,用来标示文件已被遍历完 public static File DUMMY = new File(""); private BlockingQueue<File> queue; private File startingDirectory; public FileEnumerationTask(BlockingQueue<File> queue, File startingDirectory) { this.queue = queue; this.startingDirectory = startingDirectory; } /** * 遍历指定目录下的所有文件以File对象的格式放入阻塞队列中 * * @param directory * @throws InterruptedException */ public void enumerate(File directory) throws InterruptedException { if (directory == null) { return; } if (directory.isDirectory()) { File[] files = directory.listFiles(); for (File file : files) { if (file.isDirectory()) { enumerate(file); } else { queue.put(file); } } } else { queue.put(directory); } } public void run() { try { enumerate(startingDirectory); queue.put(DUMMY); } catch (InterruptedException e) { e.printStackTrace(); } } } class SearchTask implements Runnable { private BlockingQueue<File> queue; private String keyword; public SearchTask(BlockingQueue<File> queue, String keyword) { this.queue = queue; this.keyword = keyword; } public void run() { try { while (true) { File file = queue.take(); if (file == FileEnumerationTask.DUMMY) { queue.put(file); break; } else { search(file); } } } catch (Exception e) { e.printStackTrace(); } } public void search(File file) throws IOException { if (file == null) { return; } Scanner scanner = new Scanner(new FileInputStream(file)); int lineNumber = 0; while (scanner.hasNextLine()) { lineNumber++; String line = scanner.nextLine(); if (line.contains(keyword)) { System.out.println("文件:" + file.getPath() + " 行数:" + lineNumber + " 行内容:" + line); } } scanner.close(); } }