使用Callable ,Future实现查找指定目录以及子目录下的指定关键字
2013-11-13 22:47
399 查看
在给定的某个文件夹下查找给定的关键字keywords
程序源于Java核心技术(卷I)第8版 基础知识(中文版)
作者:Cay S.Horstmann,Gray Cornell ,
第14章多线程中的第14.8节Callable ,Future,源码如下:
程序源于Java核心技术(卷I)第8版 基础知识(中文版)
作者:Cay S.Horstmann,Gray Cornell ,
第14章多线程中的第14.8节Callable ,Future,源码如下:
package v1ch14.FutureTest; import java.io.*; import java.util.*; import java.util.concurrent.*; /** * @version 1.0 2004-08-01 * @author Cay Horstmann */ public class FutureTest { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("Enter base directory (e.g. /usr/local/jdk5.0/src): "); String directory = in.nextLine(); System.out.print("Enter keyword (e.g. volatile): "); String keyword = in.nextLine(); MatchCounter counter = new MatchCounter(new File(directory), keyword); FutureTask<Integer> task = new FutureTask<Integer>(counter); Thread t = new Thread(task); t.start(); try { System.out.println(task.get() + " matching files."); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { } } } /** * This task counts the files in a directory and its subdirectories that contain a given keyword. */ class MatchCounter implements Callable<Integer> { /** * Constructs a MatchCounter. * @param directory the directory in which to start the search * @param keyword the keyword to look for */ public MatchCounter(File directory, String keyword) { this.directory = directory; this.keyword = keyword; } public Integer call() { count = 0; try { File[] files = directory.listFiles(); ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>(); for (File file : files) if (file.isDirectory()) { MatchCounter counter = new MatchCounter(file, keyword); FutureTask<Integer> task = new FutureTask<Integer>(counter); results.add(task); Thread t = new Thread(task); t.start(); } else { if (search(file)) count++; } for (Future<Integer> result : results) try { count += result.get(); } catch (ExecutionException e) { e.printStackTrace(); } } catch (InterruptedException e) { } return count; } /** * Searches a file for a given keyword. * @param file the file to search * @return true if the keyword is contained in the file */ public boolean search(File file) { try { Scanner in = new Scanner(new FileInputStream(file)); boolean found = false; while (!found && in.hasNextLine()) { String line = in.nextLine(); if (line.contains(keyword)) found = true; } in.close(); return found; } catch (IOException e) { return false; } } private File directory; private String keyword; private int count; }
相关文章推荐
- 采用多线程和生产者消费者模式来实现对于一个目录以及所有子目录下的文件内容的搜索,打印出包含指定关键字的行.
- 查找指定目录下所有文件(包括子目录)——使用递归
- Python实现查找指定目录下包括某关键字的所有文件脚本
- 使用grep查找指定目录下的关键字
- Python:编写函数,能在当前目录以及子目录下查找文件名包含指定字符串的文件,并打印出完整路径
- python 文件和目录 当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
- 使用grep查找指定目录下的关键字
- Python 在当前目录以及其子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
- 编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
- 使用grep查找指定目录下的关键字
- 在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径
- Linux下使用find查找文件内容,跳过所有目录名成和指定子目录的方法
- Python脚本实现查找指定目录下包含指定关键字的文件
- 【代码】当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出绝对路径
- 编写一个Python程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径
- Java使用阻塞队列实现指定文件夹下面搜索指定关键字
- java实现在指定目录中查找字符串
- 一个使用多线程删除指定目录及子目录下所有指定文件的Java程序(源码)
- 使用线程加载指定目录下的所有子目录和文件名称到TreeView中
- 指定文件目录下搜索关键字(Java实现,递归方式)