`
saluya
  • 浏览: 120498 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

请您先登录,才能继续操作

阻塞队列 查找文件夹下文件,匹配出指定字符的文件名、行数、该行语句

阅读更多
public class BlockingQueueTest {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.printf("Enter base directory(e.g. /usr/local/jdk5.0/src):");
		String directory = in.nextLine();
		System.out.print("Enter keyword(e.g volatile):");
		String keywords = in.nextLine();

		final int FILE_QUEUE_SIZE = 10;
		final int SEARCH_THREADS = 100;
		
		BlockingQueue<File> queue = new ArrayBlockingQueue<File>(FILE_QUEUE_SIZE);
		FileEnumerationTask enumerator = new FileEnumerationTask(queue, new File(directory));
		new Thread(enumerator).start();
		for (int i = 1; i <= SEARCH_THREADS; i++) {
			new Thread(new SearchTask(queue, keywords)).start();
		}
	}
}
 
/**
 * 这个任务枚举所有目录中的文件及其子目录
 */
public class FileEnumerationTask implements Runnable{
	public FileEnumerationTask(BlockingQueue<File> queue, File startingDirectory) {
		this.queue = queue;
		this.startingDirectory = startingDirectory;
	}

	public void run() {
		try {
			enumerate(startingDirectory);
			queue.put(DUMMY);
		} catch (InterruptedException e) {
		}
	}
	
	/**
	 * 递归地列举了在一个给定的的目录中的所有文件和其子目录
	 * @param directory 开始目录
	 * @throws InterruptedException
	 */
	public void enumerate(File directory) throws InterruptedException {
		File[] files = directory.listFiles();
		for (File file : files) {
			if (file.isDirectory()) {
				enumerate(file);
			} else {
				queue.put(file);
			}
		}
	}
	
	public static File DUMMY = new File("");
	private BlockingQueue<File> queue;
	private File startingDirectory;
}
/**
 * 这个任务对于一个给定的关键字搜索文件
 */
public class SearchTask implements Runnable {

	public SearchTask(BlockingQueue<File> queue, String keyword) {
		this.queue = queue;
		this.keyword = keyword;
	}
	
	public void run() {
		try {
			boolean done = false;
			while (!done) {
				File file = queue.take();
				if (file == FileEnumerationTask.DUMMY) {
					queue.put(file);
					done = true;
				} else {
					search(file);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 搜索特定关键字的文件和打印所有匹配的行
	 * @param file
	 * @throws IOException
	 */
	public void search(File file) throws IOException {
		Scanner in = new Scanner(new FileInputStream(file));
		int lineNumber = 0;
		
		while (in.hasNextLine()) {
			lineNumber++;
			String line = in.nextLine();
			if (line.contains(keyword)) {
				System.out.printf("%s:%d:%s%n", file.getPath(), lineNumber, line);
			}
		}
		in.close();
	}

	private BlockingQueue<File> queue;
	private String keyword;
}
分享到:
评论

相关推荐

    统计文本文件中的字符单词和行数

    在IT领域,尤其是在软件开发中,经常会遇到对文本文件进行各种操作的需求,如统计文本文件中的字符、单词和行数。MFC(Microsoft Foundation Classes)是微软提供的一个C++类库,用于构建Windows应用程序,它提供了...

    QT文件查询,查询单个文件和文件夹下所有文件行数

    QT文件查询是一个基于Qt...通过上述知识点,我们可以构建出一个功能完善的“QT文件查询”应用,满足用户快速统计文件和文件夹下所有文件行数的需求。这个应用不仅可以作为学习Qt编程的一个实例,也具有实际的实用价值。

    如何遍历文件夹查找文件

    在IT领域,遍历文件夹查找文件是一项基本且重要的任务,尤其在进行系统管理、数据处理或软件开发时。这个过程通常涉及到编程语言中的文件I/O(输入/输出)操作和目录遍历功能。以下是一些关于如何遍历文件夹查找文件...

    Node.JS枚举统计当前文件夹和子目录下所有代码文件行数

    本文中提到的“Node.JS枚举统计当前文件夹和子目录下所有代码文件行数”的知识点,主要涉及以下内容: 1. 引入必要的模块 首先需要引入Node.js内置的模块,包括path模块和fs模块。path模块提供了文件路径的各种操作...

    支持多线程和泛型的阻塞队列

    阻塞队列(Blocking Queue)是线程安全的数据结构,它结合了队列的先进先出(FIFO)原则和等待机制。当队列为空时,尝试获取元素的线程会被阻塞,直到队列中有新的元素;当队列满时,尝试插入元素的线程也会被阻塞,...

    查找指定目录的所有文件(PB9)

    标题 "查找指定目录的所有文件(PB9)" 涉及的是在编程环境下,特别是PowerBuilder 9(PB9)中实现文件系统操作的功能。PowerBuilder是Sybase公司开发的一种可视化的、面向对象的编程工具,主要用于构建桌面应用程序。...

    列出目录中所有文件(含文件夹)

    在IT领域,尤其是在编程和系统管理中,"列出目录中所有文件(含文件夹)"是一个常见的需求。这个任务涉及到操作系统交互、文件系统操作以及编程语言的特定功能。以下是关于这个主题的详细知识: 1. **文件系统**:...

    C#编写的读取文件夹下所有的文件,文件格式可以根据自己的要求设定。

    在C#编程中,读取文件夹下的所有文件是一项常见的任务,特别是在处理大量数据或进行文件操作时。本文将深入探讨如何使用C#语言来实现这个功能,特别是针对特定文件格式,例如本例中的txt文件。 首先,让我们了解C#...

    nodejs实现遍历文件夹并统计文件大小

    排序后,将结果拼接成一个字符串`str`,该字符串包含了每个文件的文件名、大小和路径信息。 最后,程序将拼接好的字符串写入到一个文本文件中。这里使用了`fs.writeFile`方法,并指定编码为'utf-8',完成文件写入后...

    监听文件下文件发生变化时复制文件到另一个文件夹

    本案例的标题和描述提到了“监听文件下文件发生变化时复制文件到另一个文件夹”,这通常涉及到文件系统的观察者模式(Observer Pattern)和多线程技术。 首先,我们需要理解“监听文件”这一概念。在操作系统层面,...

    ListView遍历指定地址的文件及文件夹

    在这个场景下,我们使用ListView来遍历并展示指定路径下的文件和文件夹,比如展示大量的电影列表。这种功能对于用户管理和浏览本地存储的多媒体内容非常实用。下面我们将详细探讨如何实现这个功能。 首先,我们需要...

    Qt文件或文件夹拷贝

    在Qt库中,进行文件和文件夹的拷贝操作是一项常见的任务,这在软件开发中尤其重要,因为可能需要在程序运行过程中动态处理文件和数据迁移。`Qt`提供了丰富的API来实现这些功能,让我们详细了解一下如何使用`Qt`进行...

    MyLineCounter统计代码行数的工程(递归+工作队列)

    在" MyLineCounter "中,工作队列可能被用来异步处理文件,避免阻塞主线程,提高程序响应速度。当新的文件或目录需要被处理时,它们会被添加到队列中,后台的工作线程会逐一取出并计算代码行数,这样可以充分利用...

    并发-线程池和阻塞队列.pdf

    对于有界队列,必须仔细考虑队列大小与线程池大小的配合,防止因线程池和队列不匹配造成的性能问题。 综上所述,线程池和阻塞队列是并发编程中的核心概念。它们的合理使用能够显著提升程序性能,降低资源消耗,并...

    asp.net 遍历指定文件夹的所有文件

    在ASP.NET中,遍历指定文件夹的所有文件是一项常见的任务,尤其在处理文件上传、下载、备份或文件操作时。这个任务可以通过使用System.IO命名空间中的类来实现,特别是Directory和FileInfo这两个类。下面我们将详细...

    spring boot文件夹文件监听程序

    总的来说,"spring boot文件夹文件监听程序"是一个结合了Java文件系统监听和Spring Boot自动化功能的实用工具,它可以实时监控指定目录,及时响应文件变化,对于文件管理、数据同步等场景具有很高的价值。...

    阻塞队列阻塞队列阻塞队列

    在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;同样,当队列满时,试图插入...

    C#获取指定文件夹下的所有文件夹

    在C#编程中,获取指定文件夹下的所有子文件夹是一项常见的任务,这对于文件管理和系统操作至关重要。这个任务可以通过使用System.IO命名空间中的Directory和DirectoryInfo类来实现。以下是一些详细的知识点: 1. **...

    delphi 实现文件夹内容监控

    文件夹内容监控是系统编程中的一个重要方面,它允许开发者跟踪指定目录下的文件变动,如新建、删除或修改,这对于日志记录、数据备份、版本控制等应用场景非常有用。 首先,实现这个功能的关键在于操作系统提供的...

    java模拟阻塞队列

    阻塞队列结合了队列的数据结构与线程同步机制,使得生产者可以在队列满时被阻塞,而消费者则在队列空时被阻塞,这样可以避免无效的循环检查,提高程序的运行效率。 首先,我们需要了解什么是生产者-消费者模型。在...

Global site tag (gtag.js) - Google Analytics