利用Java语言的文件基本操作和文件读写内容对包含关键字的文件进行查找路径操作
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class 全文解锁 {
public static void main(String[] args) throws IOException {
//1.用户输入待搜索的路径和关键词
//2.遍历目录和文件进行查找
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要扫描的根路径");
String rootDir=scanner.next();
File rootFile=new File(rootDir);
if(!rootFile.isDirectory()){
System.out.println("目录不存在");
return;
}
System.out.println("请输入查询的关键词");
String query=scanner.next();
//遍历文件进行匹配
List result=new ArrayList<>();
scanDirWithContent(rootFile,query,result);
for ( File F:result
) {
System.out.println(rootFile.getCanonicalPath());
}
}
private static void scanDirWithContent(File rootFile, String query, List result) {
File[]files=rootFile.listFiles();
if(files==null||files.length==0){
return;
//空的目录直接返回
}
for (File f:files) {
if(f.isDirectory()){
scanDirWithContent(f,query,result);
}else {
//文件名是否包含关键字
if (f.getName().contains(query)) {
result.add(f);
}
//文件内容是否包含关键字
else if(isContains(f,query)){
result.add(f);
}
}
}
}
public static boolean isContains(File f,String query){
StringBuilder stringBuilder=new StringBuilder();
try(InputStream inputStream= new FileInputStream(f)){
Scanner scanner=new Scanner(inputStream,"UTF-8");
while (scanner.hasNextLine()){
String line=scanner.nextLine();
stringBuilder.append(line+"n");
}
}
catch (IOException e){
e.printStackTrace();
}
return stringBuilder.indexOf(query)!=-1;
}
}
这个方法不适合大规模的文件查找因为效率比较慢,一款应用名为everything的应用查找速度较快,其原理是在电脑处于空闲状态时,自动遍历电脑中的文件,提前备份,相当于使用者在调用的时候免除了查找的过程,相当于工作提前做完,只等检查了,因此以提高效率,具体的提前查找与该方法类似



