1. BlockingQueueTest.java
import java.io.File;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("Enter base directory :(e.g /usr/local/) : ");
String directory = in.nextLine();
System.out.println("Enter Keyword :(e.g android ) : ");
String keyword = in.nextLine();
final int FILE_QUEUE_SIZE = 10;
final int SEARCH_THREAD = 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 = 0; i < SEARCH_THREAD; i++) {
new Thread(new SerchTask(queue, keyword)).start();
}
}
}
2. FileEnumerationTask.java
import java.io.File;
import java.util.concurrent.BlockingQueue;
public class FileEnumerationTask implements Runnable {
private BlockingQueue<File> queue;
private File startDirectory ;
public static File DUMMY = new File("");
public FileEnumerationTask(BlockingQueue<File> queue, File startDirectory) {
// TODO Auto-generated constructor stub
this.queue = queue;
this.startDirectory = startDirectory;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
enumerate(startDirectory);
queue.put(DUMMY);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void enumerate(File directory) throws InterruptedException {
// TODO Auto-generated method stub
File [] files = directory.listFiles();
for (File file : files) {
if(file.isDirectory()) enumerate(file);
else queue.put(file);
}
}
}
3. SerchTask.java
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.BlockingQueue;
public class SerchTask implements Runnable {
private BlockingQueue<File> queue;
private String keyword;
public SerchTask(BlockingQueue<File> queue, String keyword) {
// TODO Auto-generated constructor stub
this.queue = queue;
this.keyword = keyword;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
boolean done = false;
while (!done) {
File file = queue.take();
if (file == FileEnumerationTask.DUMMY) {
queue.put(file);
done = true;
}else
search(file);
}
} catch (InterruptedException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void search(File file) throws IOException{
Scanner in = new Scanner(new FileInputStream(file));
int lineNumber = 0;
while (in.hasNext()) {
lineNumber++;
String line = in.nextLine();
if(line.contains(keyword))
System.out.printf("%s:%d:%s%n", file.getPath(),lineNumber,line);
}
in.close();
}
}