Java代码实现 寻找指定文件夹里特定字符串
在Java学习者的早期有一些不优雅的习惯,如常量字符串未命名(魔法值)而当这个值需要修改时,需要修改所有出现的地方,而自己都记不清哪里出现过,我们可以使用搜索工具查找,也可以自己写一个简单的工具,甚至还可以自动替换为希望的值。
不再推荐这样实现!
- 若搜索代码,IDEA里有全局搜索和替换:
Edit - Find - Find in path
- 若搜索本地文件,推荐
EveryThing
这个软件
代码
import java.io.*;
import java.util.ArrayList;
/**
* 找出特定文件夹下的所有代码中出现的某个字符串,并回显在哪里出现过
*/
public class Finder {
private static final String BASE_DIR = "E:\\files\\code\\java\\xxx\\src\\main\\resources\\templates";
//private static final String BASE_DIR = "E:\\files\\code\\java\\xxx\\src\\main\\java";
private static ArrayList<File> fileArray = new ArrayList<File>();
public static void main(String[] args) throws IOException {
ArrayList<File> all = getFile(new File(BASE_DIR));
String[] aimStrings = {"~{::link}"};
for (File f : all) {
find(f, aimStrings);
}
}
/**
* 获得目录下的文件和子目录下的文件
*/
private static ArrayList<File> getFile(File f) {
File[] ff = f.listFiles();
for (File child : ff) {
if (child.isDirectory()) {
getFile(child);
} else
fileArray.add(child);
}
return fileArray;
}
private static void find(File file, String... aimStrings) throws IOException {
if(aimStrings == null || aimStrings.length == 0)
return;
try (FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr)){
int lineNum = 1;
String string; //存储对目标文件读取的内容
while ((string = br.readLine()) != null){
for (String aimStr : aimStrings){
if(string.contains(aimStr))
System.out.println(aimStr + " : " + (file.getAbsolutePath().replace(BASE_DIR, "")) + " - " + lineNum);
}
lineNum ++;
}
} catch(Exception e){
e.printStackTrace();
}
}
}