普通查找
package com.yzq.io;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FindKey {
public static void Find(String filefolder, String key) throws FileNotFoundException {
// 遍历
File in = new File(filefolder);
Findfile(in, key);
}
public static void Findfile(File file, String key) throws FileNotFoundException {
if (file.isFile()) {
Scanner sc = new Scanner(file, "UTF-8");
int lineNumber = 0;
while (sc.hasNextLine()) {
lineNumber++;
String line = sc.nextLine();
if (line.contains(key))
System.out.printf("%s:%d:%s\n", file.getPath(), lineNumber, line.trim());
}
} else {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File file1 : files) Findfile(file1, key);
}
}
}
public static void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(System.in);
System.out.println("Enter base directory (e.g /opt/jdk1.8,0/src): ");
String directory = in.nextLine();
System.out.println("Enter keyword(e.g. volatite): ");
String keyword = in.nextLine();
Find(directory, keyword);
}
}
阻塞队列
package com.yzq.threadex;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueTest {
private static final int FILE_QUEUE_SIZE = 10;
private static final int SEARCH_THREADS = 100;
private static final File DUMMY = new File("");
private static BlockingQueue<File> queue = new ArrayBlockingQueue<>(FILE_QUEUE_SIZE);
public static void main(String[] args) {
try (Scanner in = new Scanner(System.in)) {
System.out.println("Enter base directory (e.g /opt/jdk1.8,0/src): ");
String directory = in.nextLine();
System.out.println("Enter keyword(e.g. volatite): ");
String keyword = in.nextLine();
Runnable enumerator =
() -> {
try {
enumerate(new File(directory));
queue.put(DUMMY);
} catch (InterruptedException e) {
}
};
new Thread(enumerator).start();
for (int i = 0; i <= SEARCH_THREADS; i++) {
Runnable searcher =
() -> {
try {
boolean done = false;
while (!done) {
File file = queue.take();
if (file == DUMMY) {
queue.put(file);
done = true;
} else search(file, keyword);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
}
};
new Thread(searcher).start();
}
}
}
public static 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 void search(File file, String keyword) throws IOException {
try (Scanner in = new Scanner(file, "UTF-8")) {
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.trim());
}
}
}
}