一、全文检索功能
在我们的电脑中有很多的目录,每个目录中又存在许多文件,每个文件里又有许多的内容,现在假定某些文件中包含hello_world这个关键词。我们写一个程序,找出哪些文件中包含这些关键词
实现方法
- 1.递归遍历目录
- 2.每次找到一个文件都打开,读取文件中内容
- 3.判定所查询的词是否存在于这些文件中。
注意:这种实现方式并不高效,只是简单粗暴的实现方式
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;
public class iodemo6 {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
//1.先让用户指定一个要进行搜索的根目录
System.out.println("请输入要扫描的根目录");
File rootDir = new File(scanner.next());
if(!rootDir.isDirectory()){
//输入的目录不存在,返回
System.out.println("你输入的目录不存在!");
return;
}
//2.让用户输入一个要查询的词
System.out.println("请输入要查询的词");
String word = scanner.next();
//3.递归遍历目录
scanDir(rootDir,word);
}
//递归实现遍历目录的逻辑
public static void scanDir(File rootDir,String word) throws IOException {
File[] files = rootDir.listFiles();//将rootDir目录里的内容都列出来放到Files文件夹里
if(files == null){
//说明这个目录里没有东西 返回上一级
return;
}
for (File f: files) {
//遍历这些目录里的东西
//三个判断
/**
* 是不是目录,如果是目录,递归
* 是不是文件,如果是文件,打开
* 如果不是文件也不是目录,跳过,在Linux中有很多不是目录也不是文件的东西
*/
if(f.isDirectory()){
//是文件 打开 读出了一串字符
String content = fileread(f);
if(content.contains(word)){
//如果包含
System.out.println("包含");
}
} else if (f.isFile()) {
//是目录
scanDir(f,word);//递归
}else {
//不是目录也不是文件,跳过
continue;
}
}
}
public static String fileread(File f) throws IOException {
//一般都是字符流文件 所以使用Reader
StringBuilder stringBuilder = new StringBuilder();//使用StringBuilder来拼接文件
try(Reader reader = new FileReader(f)) {
while (true){
int a = reader.read();
if(a == -1){
break;
}
//走到这里说明没有走到末尾,将其添加到stringBuilder
stringBuilder.append((char)a);//由于读出来的是int,在拼接时需要强转为char
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
}