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编程的一个实例,也具有实际的实用价值。
在IT领域,遍历文件夹查找文件是一项基本且重要的任务,尤其在进行系统管理、数据处理或软件开发时。这个过程通常涉及到编程语言中的文件I/O(输入/输出)操作和目录遍历功能。以下是一些关于如何遍历文件夹查找文件...
本文中提到的“Node.JS枚举统计当前文件夹和子目录下所有代码文件行数”的知识点,主要涉及以下内容: 1. 引入必要的模块 首先需要引入Node.js内置的模块,包括path模块和fs模块。path模块提供了文件路径的各种操作...
阻塞队列(Blocking Queue)是线程安全的数据结构,它结合了队列的先进先出(FIFO)原则和等待机制。当队列为空时,尝试获取元素的线程会被阻塞,直到队列中有新的元素;当队列满时,尝试插入元素的线程也会被阻塞,...
标题 "查找指定目录的所有文件(PB9)" 涉及的是在编程环境下,特别是PowerBuilder 9(PB9)中实现文件系统操作的功能。PowerBuilder是Sybase公司开发的一种可视化的、面向对象的编程工具,主要用于构建桌面应用程序。...
在IT领域,尤其是在编程和系统管理中,"列出目录中所有文件(含文件夹)"是一个常见的需求。这个任务涉及到操作系统交互、文件系统操作以及编程语言的特定功能。以下是关于这个主题的详细知识: 1. **文件系统**:...
在C#编程中,读取文件夹下的所有文件是一项常见的任务,特别是在处理大量数据或进行文件操作时。本文将深入探讨如何使用C#语言来实现这个功能,特别是针对特定文件格式,例如本例中的txt文件。 首先,让我们了解C#...
排序后,将结果拼接成一个字符串`str`,该字符串包含了每个文件的文件名、大小和路径信息。 最后,程序将拼接好的字符串写入到一个文本文件中。这里使用了`fs.writeFile`方法,并指定编码为'utf-8',完成文件写入后...
本案例的标题和描述提到了“监听文件下文件发生变化时复制文件到另一个文件夹”,这通常涉及到文件系统的观察者模式(Observer Pattern)和多线程技术。 首先,我们需要理解“监听文件”这一概念。在操作系统层面,...
在这个场景下,我们使用ListView来遍历并展示指定路径下的文件和文件夹,比如展示大量的电影列表。这种功能对于用户管理和浏览本地存储的多媒体内容非常实用。下面我们将详细探讨如何实现这个功能。 首先,我们需要...
在Qt库中,进行文件和文件夹的拷贝操作是一项常见的任务,这在软件开发中尤其重要,因为可能需要在程序运行过程中动态处理文件和数据迁移。`Qt`提供了丰富的API来实现这些功能,让我们详细了解一下如何使用`Qt`进行...
在" MyLineCounter "中,工作队列可能被用来异步处理文件,避免阻塞主线程,提高程序响应速度。当新的文件或目录需要被处理时,它们会被添加到队列中,后台的工作线程会逐一取出并计算代码行数,这样可以充分利用...
对于有界队列,必须仔细考虑队列大小与线程池大小的配合,防止因线程池和队列不匹配造成的性能问题。 综上所述,线程池和阻塞队列是并发编程中的核心概念。它们的合理使用能够显著提升程序性能,降低资源消耗,并...
在ASP.NET中,遍历指定文件夹的所有文件是一项常见的任务,尤其在处理文件上传、下载、备份或文件操作时。这个任务可以通过使用System.IO命名空间中的类来实现,特别是Directory和FileInfo这两个类。下面我们将详细...
总的来说,"spring boot文件夹文件监听程序"是一个结合了Java文件系统监听和Spring Boot自动化功能的实用工具,它可以实时监控指定目录,及时响应文件变化,对于文件管理、数据同步等场景具有很高的价值。...
在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;同样,当队列满时,试图插入...
在C#编程中,获取指定文件夹下的所有子文件夹是一项常见的任务,这对于文件管理和系统操作至关重要。这个任务可以通过使用System.IO命名空间中的Directory和DirectoryInfo类来实现。以下是一些详细的知识点: 1. **...
文件夹内容监控是系统编程中的一个重要方面,它允许开发者跟踪指定目录下的文件变动,如新建、删除或修改,这对于日志记录、数据备份、版本控制等应用场景非常有用。 首先,实现这个功能的关键在于操作系统提供的...
阻塞队列结合了队列的数据结构与线程同步机制,使得生产者可以在队列满时被阻塞,而消费者则在队列空时被阻塞,这样可以避免无效的循环检查,提高程序的运行效率。 首先,我们需要了解什么是生产者-消费者模型。在...