`

搜索文件中的关键字

阅读更多

首先2个思维:

     第一个是:借助阻塞列表,有一个线程把一个文件夹下的所有文件放入列表。

                    然后是100个线程,循环不断的从列表中取出文件,检查这个文件是否有关键字,有就计数加一,直到列表为空,返回这个线程的计数。整体来说就读取就一百个线程,不断检查。

 

  第二个是:用到递归,一个callable线程,传入一个文件,如果这个文件是个目录,则把它目录下的每个文件传入这个定义的callable线程,如果是个文件 则搜索关键字,最后返回这个线程的计数(目录则返回目录下的所有计数和,文件就返回这个文件的计数),感觉是树形的结构。

贴代码:

第一个:

 

package v1ch14.FutureTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * @version 2010-10-18 上午09:34:18
 * @author DaWei han
 * @EMAIL  handawei_1@126.com
 */
public class MyFutureTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		System.out.print("Enter the directory eg. D:\\Java\\jdk1.6\\src:");
	    String directory=in.nextLine();
	    System.out.println("Enter the key word eg. volatile:");
	    String keyword=in.nextLine();
	    System.out.println("finished the input.");
	    final int NUMBER_QUEUE_SIZE=10;
	    final int NUMBER_SEARCH=100;
	    
	    
	    
	    BlockingQueue<File> queue=new ArrayBlockingQueue<File>(NUMBER_QUEUE_SIZE);
	    new Thread(new FileEnumerationTask(queue,new File(directory))).start();
	    List<FutureTask<Integer>> rsList=new ArrayList<FutureTask<Integer>>();
	    
	    for(int i=0;i<NUMBER_SEARCH;i++)
	    {
	      	FutureTask<Integer> task=new FutureTask<Integer>(new SerachTack(queue,keyword));
	    	rsList.add(task);
	      	new Thread(task).start();
	      
	    }
	    int num=0;
	    for(FutureTask<Integer> taskTwo:rsList)
	    {
	    	try {
	    		System.out.println("the num is:"+num);
				num+=taskTwo.get();
				System.out.println("the num is:"+num);
				System.out.println("========================================>");
			} catch (Exception e) {
				e.printStackTrace();
			} 
	    }
	    System.out.println("the total num is :"+num);
	}
}

class SerachTack implements Callable<Integer>
{
	public SerachTack(BlockingQueue<File> queue,String keyword)
	{
		this.queue=queue;
		this.keyword=keyword;
	}
	public Integer call() throws Exception {
		rsNum=0;
        
        boolean done=false;
        
        while(!done)
        {
        	File file=queue.take();
        	if(file==FileEnumerationTask.DUMM)
        	{
        		done =true;
        		queue.put(file);
        	}else{
        		rsNum+=searchKey(file,keyword);
        	}
        }
		return rsNum;
	}
	private int searchKey(File file,String keyword)
	{
		//此为每行要是有关键字,就加1
//		int num=0;
//		try {
//			Scanner in=new Scanner(new FileInputStream(file));
//			while(in.hasNextLine())
//			{
//				if(in.nextLine().contentEquals(keyword)){
//					num++;
//				};
//			}
//		}catch (FileNotFoundException e) {
//			e.printStackTrace();
//		}
//	  return num;
	//=======>此为一个文件要是有关键字 就返回1 @1
		try {
			Scanner in=new Scanner(new FileInputStream(file));
			while(in.hasNextLine())
			{
				if(in.nextLine().contains(keyword)){
					System.out.println("matched in the file:"+file.getPath());
					return 1;
				};
			}
		}catch(FileNotFoundException e) {
			e.printStackTrace();
		}
		return 0; 
  //<====================
	}

	private Integer rsNum;
	private BlockingQueue<File> queue;
	private String keyword;
}

class FileEnumerationTask implements Runnable
{
	public FileEnumerationTask(BlockingQueue<File> queue,File directory)
	{
		this.queue=queue;
		this.directory=directory;
	}
	public void run() {
		try {
		    searchFile(this.directory);
			queue.put(DUMM);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	public void searchFile(File directory)
	{
		try {
		File[] files=directory.listFiles();
		for(File file:files)
		{
			if(file.isDirectory())searchFile(file);
			else
			queue.put(file);
		}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	public static File DUMM=new File("");
	private File directory;
	private BlockingQueue<File> queue;
}

 

 

第二个:

 

package v1ch14.FutureTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * @version 2010-10-18 下午02:36:52
 * @author DaWei han
 * @EMAIL  handawei_1@126.com
 */
public class MyFutureTest2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		System.out.print("Enter the directory eg. D:\\Java\\jdk1.6\\src:");
	    String directory=in.nextLine();
	    System.out.println("Enter the key word eg. volatile:");
	    String keyword=in.nextLine();
	    System.out.println("finished the input.");
	    FutureTask<Integer> task=new FutureTask<Integer>(new MyMatchCounter(new File(directory), keyword));
	    new Thread(task).start();
	    try {
			System.out.println("the Toatl num is:"+task.get());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
class MyMatchCounter implements Callable<Integer>
{	
   public MyMatchCounter(File directory,String keyword)
   {
	   this.directory=directory;
	   this.keyword=keyword;
   }
   
	public Integer call() throws Exception {
       int num=0;
		List<FutureTask<Integer>> rsList=new ArrayList<FutureTask<Integer>>();
		if(directory.isDirectory())
        {
			File[] files=directory.listFiles();
			for(File file:files)
			{
				MyMatchCounter counter=new MyMatchCounter(file,this.keyword);
				FutureTask<Integer> task=new FutureTask<Integer>(counter);
				rsList.add(task);
			   new Thread(task).start();	
			}
        	
        }else{
         num=search(directory);	
        }
		for(FutureTask<Integer> taskTwo:rsList)
		{
			num+=taskTwo.get();
		}
		return num;
	}
	
  public Integer search(File file)
  {
	  try {
		Scanner in=new Scanner(new FileInputStream(file));
        while(in.hasNextLine())
        {
        	if(in.nextLine().contains(this.keyword))
        	{
        		System.out.println(" Match the keyword in file:"+file.getPath());
                return 1;        		
        	}
        }
	  } catch (FileNotFoundException e) {
		e.printStackTrace();
	}
	return 0;  
  }
private File directory;
private String keyword;
}

 

下面是用线程池改写第二个:

 

package v1ch14.ThreadPoolTest;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * @version 2010-10-18 下午04:04:31
 * @author DaWei han
 * @EMAIL  handawei_1@126.com
 */
public class MyThreadPoolTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		System.out.print("Enter the directory eg. D:\\Java\\jdk1.6\\src:");
	    String directory=in.nextLine();
	    System.out.print("Enter the key word eg. volatile:");
	    String keyword=in.nextLine();
	    System.out.print("finished the input.");

		ExecutorService pool=Executors.newCachedThreadPool();
		MyMatchCounter counter=new MyMatchCounter(new File(directory),keyword,pool);
        Future<Integer> result= pool.submit(counter);	
		
        try {
			System.out.println("the total number is :"+result.get());
		}catch (Exception e) {
			e.printStackTrace();
		} 
		pool.shutdown();
	}
	

}
class MyMatchCounter implements Callable<Integer>
{
	public MyMatchCounter(File direcotry,String keyword,ExecutorService pool)
	{
		this.directory=direcotry;
		this.keyword=keyword;
		this.pool=pool;
	}
	public Integer call() throws Exception {
         int num=0;
         ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>();
		File[] files=directory.listFiles();
		for(File file:files)
		{
			if(file.isDirectory())
			{
				results.add(pool.submit(new MyMatchCounter(file, keyword, pool)));
			}else
			{
			   num+=searchFile(file);	
			}
		}
		for(Future<Integer> rs:results)
		{
			num+=rs.get();
		}
		return num;
	}
private Integer searchFile(File file)
{
	
	Scanner in=null;
      try {
    	  in= new Scanner(new FileInputStream(file));
		while(in.hasNextLine())
		{
			if(in.nextLine().contains(this.keyword))
				return 1;
		}
	} catch (Exception e) {
		e.printStackTrace();
	}finally{
		in.close();
	}
	return 0;
}
 private File directory;
 private String keyword;
 private ExecutorService pool;
}

 

分享到:
评论

相关推荐

    MFC 界面程序实现文本文件中关键字的搜索抓取

    【MFC 界面程序实现文本文件中关键字的搜索抓取】 MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序。它封装了Windows API,简化了用户界面(UI)的创建和管理。在这个特定的...

    vb 查找文件内容关键字小程序 递归方法

    标题中的“vb 查找文件内容关键字小程序 递归方法”指的是使用Visual Basic(VB)编程语言编写的一个小型程序,它的功能是搜索指定文件或文件夹内的文本内容,并找出包含特定关键字的所有文件。这个程序利用了递归...

    在文本文件中查找关键字

    在文本文件中查找关键字是日常编程任务中常见的一环,特别是在大数据分析、日志处理以及文本挖掘等场景中。本文将深入探讨两种不同的方法来实现这一功能:一次性读取整个文件和使用缓冲区分批读取。 首先,一次性...

    在Unix上搜索含有关键字的文件

    在Unix系统中,搜索含有特定关键字的文件是一项基础但至关重要的任务。这使得用户能够快速定位到包含所需信息的文件,提高工作效率。Unix提供了一系列强大的命令行工具来帮助用户完成这项工作,其中最常用的是`grep`...

    C#的搜索doc\xls\ppt文件中关键字的程序

    在本文中,我们将深入探讨如何使用C#编程语言来实现一个功能,即在Microsoft Office 2003的文档(doc、xls、ppt)中搜索特定关键字。这个程序的实现涉及了文本处理、文件操作以及对Office文档格式的理解。下面我们将...

    快速检索文件关键字检查涉密文件

    标题 "快速检索文件关键字检查涉密文件" 描述的是一种技术,主要用于保密局等机构,目的是迅速定位并识别可能含有敏感或涉密信息的文件。这项技术的核心在于关键字搜索,通过对大量文件内容进行扫描,匹配预设的...

    java实现根据关键字查找所在文件夹的文件

    这是一个简单的Java程序,实现根据关键字查找文件的功能: ```java import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; ...

    Html文件关键字搜索

    HTML文件关键字搜索是一种技术,主要用于在本地存储的HTML文件中查找特定关键字或短语。这一功能对于信息检索、数据挖掘以及网页分析等场景非常有用。本文将深入探讨HTML文件的关键字搜索技术,包括其原理、实现方法...

    批量搜索word关键字的程序V1.5版(新增检索文件类型pdf)

    批量搜索关键字是日常工作中常见的一种需求,特别是在处理大量文档时,快速定位含有特定信息的文件显得尤为重要。"批量搜索word关键字的程序V1.5版(新增检索文件类型pdf)"是一个专门解决这类问题的实用工具。这个...

    文件关键字查找.rar

    我们经常处理一大堆的文件,文件,特别是要替换一些关键字的时候就需要用它了,速度快定位准。...由于文件太多,而且分布在不同的文件夹里面,一个个文件打开去查找实在太麻烦。这个时候,往往会愁死了人。

    多文件查找关键字工具

    可以帮助你查找多个文件中是否有你要查找的关键字。

    C# 查找多个word文件包含关键字

    C# 做的查找多个word文件包含关键字 1、实现doc转为docx; 2、指定目录下的所有word文件查找关建字 采用 using NPOI.SS.Formula.Functions; using Microsoft.Office.Interop.Word; 这两个开源组件实现 NPOI.SS....

    批量搜索word关键字的程序V1.4版

    《批量搜索Word关键字程序V1.4版:高效查找与数据整理工具》 批量搜索Word关键字的程序V1.4版是一款专...其多关键字搜索、多种文件类型支持以及结果的导出功能,使其在同类工具中脱颖而出,成为日常工作中的得力助手。

    Hash查找、二分查找c语言关键字个数

    在统计源文件关键字时,哈希表可以用来存储关键字及其出现次数,快速统计关键字个数。 二分查找,又称为折半查找,是一种适用于有序数组的查找算法。在本项目中,可能会先对C语言关键字列表进行排序,然后使用二分...

    根据输入关键字找到所属文件

    这个功能通常被集成在各种文件管理软件、搜索引擎或者脚本程序中,使得用户可以通过输入特定的关键字来查找含有这些关键字的文件,从而快速定位到所需的信息。 实现这一功能的技术基础主要包括文件系统API、文本...

    PDF文件关键字查找

    3,在关键字中选择查找的关键字,点击"查找"按钮即可. 说明: 该程序仅是一个玩具程序,仅用于示例. 1,该程序只对PDF文件的第一页进行查找,不查找其他页. 2,该程序只指出关键字是否存在,并没有给出具体位置信息. 3,该...

    自动读取U盘文件查找并替换关键字小程序

    3)如何对文件中的关键字内容进行查找并替换 4)如何对类似xml文件一样,对文件内的关键字的值进行替换.例如:文本内容:...StudentName="张三".... 把关键字“StudentName”的值替换成"李四"后变成 StudentName="李四...

    文件关键字查找C#,支持PDF、ppt/excel、word、txt等主流文件

    文件关键字查找C#,支持PDF、ppt/excel、word、txt等主流文件,批量查找。

    VC++ 关键字查找对文件内容归类

    在IT行业中,尤其是在软件开发领域,关键字查找是处理文本数据时常见的操作,尤其在文本分析、信息检索和数据挖掘中有着广泛的应用。本项目聚焦于使用VC++(Visual C++)进行关键字查找并实现文件内容的归类。下面将...

    批量查找word文档中关键字并保存到excel中

    这不是源代码,是通过C#在VS2010下实现的,可以说是个小工具,实现的功能是:打开某一文件下的所有word文档,然后设置一个或多个关键字,然后查找这些关键字是否在word中出现,并将word文档名和关键字保存在excel的...

Global site tag (gtag.js) - Google Analytics