- 一、工具类
- 二、扫描文件夹下所有文件
- 三、扫描文件夹下所有文件,排除指定文件夹
- 四、扫描文件夹下指定类型文件
- 五、扫描文件夹下指定类型文件,排除指定文件夹
- 六、在指定文件中搜索字符串
- 七、在文件夹下指定类型的文件中搜索字符串
- 八、在文件夹下指定类型的文件中搜索字符串,排除指定文件夹
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class SearchWord {
public static Map scanFile(String filePath, String searchStr) {
Map map = new linkedHashMap<>();
FileInputStream file = null; //读取文件为字节流
try {
file = new FileInputStream(filePath);
InputStreamReader in = new InputStreamReader(file, StandardCharsets.UTF_8); //字节流转化为字符流,以GBK读取防止中文乱码
BufferedReader buf = new BufferedReader(in); //加入到缓存区
String str = "";
int row = 1;
while ((str = buf.readLine()) != null) { //按行读取,到达最后一行返回null
if (str.contains(searchStr)) {
map.put(row, str);
}
row++;
}
buf.close();
file.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
public static List getAllFilesPath(String dirPath) {
List list = new ArrayList<>();
return getAll_FilesPath(dirPath, list);
}
public static List getAllFilesPathEx(String dirPath, List excludeDir) {
List list = new ArrayList<>();
return getAll_FilesPath(dirPath, list, excludeDir);
}
public static List getAllFilesPath(String dirPath, List fileType) {
List list = new ArrayList<>();
return getAllFiles(dirPath, fileType, list);
}
public static List getAllFilesPath(String dirPath, List fileType, List excludeDir) {
List list = new ArrayList<>();
return getAllFiles(dirPath, fileType, list, excludeDir);
}
public static Map> searchFiles(String dirPath, String searchStr, List fileType) {
return searchFiles(dirPath, searchStr, fileType, null);
}
public static Map> searchFiles(String dirPath, String searchStr, List fileType, List excludeDir) {
List allFiles = excludeDir == null || excludeDir.size() == 0 ? getAllFilesPath(dirPath, fileType) : getAllFilesPath(dirPath, fileType, excludeDir);
Map> searchInfo = new linkedHashMap<>();
for (String f : allFiles) {
//System.out.println("正在文件中搜索,文件名:"+f);
Map map = scanFile(f, searchStr);
if (map.size() != 0) {
searchInfo.put(f, map);
}
}
return searchInfo;
}
public static void searchAndPrint(String dirPath, String searchStr, List fileType) {
Map> map = SearchWord.searchFiles(dirPath, searchStr, fileType);
for (Map.Entry> m : map.entrySet()) {
System.out.println("文件路径: " + m.getKey());
for (Map.Entry n : m.getValue().entrySet()) {
System.out.println("第" + n.getKey() + "行:" + n.getValue());
}
System.out.println();
}
}
//获取文件夹下所有的文件路径,excludeDir是要跳过查询的文件夹名列表
public static List getAll_FilesPath(String dirPath, List list, List excludeDir) {
File file = new File(dirPath);
File[] tempList = file.listFiles();
//System.out.println("正在扫描文件夹:"+dirPath);
if (null != tempList) {
for (int i = 0; i < tempList.length; i++) {
String filePath = tempList[i].toString();
if (tempList[i].isFile()) {
list.add(filePath);
} else {
//如果是文件夹则递归
if (excludeDir == null || excludeDir.size() == 0) {
getAll_FilesPath(filePath, list);
} else {
String dirName = filePath.substring(filePath.lastIndexOf("\") + 1);
if (!excludeDir.contains(dirName)) {
//如果是文件夹则递归
getAll_FilesPath(filePath, list, excludeDir);
}
}
}
}
}
return list;
}
//获取文件夹下所有的文件路径
public static List getAll_FilesPath(String path, List list) {
return getAll_FilesPath(path, list, null);
}
//获取所有的文件路径,fileType是所有要查询的文件类型
public static List getAllFiles(String dirPath, List fileType, List list) {
return getAllFiles(dirPath, fileType, list, null);
}
//获取所有的文件路径,fileType是所有要查询的文件类型,excludeDir是要跳过查询的文件夹名列表
public static List getAllFiles(String dirPath, List fileType, List list, List excludeDir) {
File file = new File(dirPath);
File[] tempList = file.listFiles();
//System.out.println("正在扫描文件夹:"+dirPath);
if (null != tempList) {
for (int i = 0; i < tempList.length; i++) {
String filePath = tempList[i].toString();
String file_Type = filePath.substring(filePath.lastIndexOf(".") + 1);
if (tempList[i].isFile()) {
//如果是文件
if (fileType.contains(file_Type)) {
list.add(filePath);
}
} else {
if (excludeDir == null || excludeDir.size() == 0) {
getAllFiles(filePath, fileType, list);
} else {
String dirName = filePath.substring(filePath.lastIndexOf("\") + 1);
if (!excludeDir.contains(dirName)) {
//如果是文件夹则递归
getAllFiles(filePath, fileType, list, excludeDir);
}
}
}
}
}
return list;
}
}
二、扫描文件夹下所有文件
扫描D:迅雷下载文件夹下的所有文件
public static void main(String[] args) {
String dir = "D:\迅雷下载\";
List filesPath = SearchWord.getAllFilesPath(dir);
filesPath.forEach(System.out::println);
}
输出:
D:迅雷下载1623720138.rar D:迅雷下载codeNotes-master.zip D:迅雷下载DittoSetup_64bit_3_24_184_0.exe D:迅雷下载eclipse-inst-jre-win64.exe D:迅雷下载eclipse-jee-2021-09-R-win32-x86_64.zip D:迅雷下载fastjson-1.2.76.jar D:迅雷下载guava-30.1.1-jre.jar D:迅雷下载ideaIU-213.5605.12.exe D:迅雷下载imageglass_8.2.6.6_x64.msi D:迅雷下载latest-win64.zip.xltd D:迅雷下载latest-win64.zip.xltd.cfg D:迅雷下载layDate-v5.3.1laydatelaydate.js D:迅雷下载layDate-v5.3.1laydatethemedefaultfonticonfont.woff D:迅雷下载layDate-v5.3.1laydatethemedefaultlaydate.css D:迅雷下载layDate-v5.3.1test.html D:迅雷下载layDate-v5.3.1文档文档.url D:迅雷下载layDate-v5.3.1更新日志.url D:迅雷下载layDate-v5.3.1.zip D:迅雷下载springboot-demo-maven-master.zip D:迅雷下载yx12345sqlyog.rar D:迅雷下载新建文件夹ideaIU-2021.1.1.exe D:迅雷下载新建文件夹note.txt三、扫描文件夹下所有文件,排除指定文件夹
扫描D:迅雷下载文件夹下的所有文件,不扫描"layDate-v5.3.1"文件夹下的文件
public static void main(String[] args) {
String dir = "D:\迅雷下载\";
List excludeDir = Arrays.asList("layDate-v5.3.1");
List filesPath = SearchWord.getAllFilesPathEx(dir,excludeDir);
filesPath.forEach(System.out::println);
}
输出:
D:迅雷下载1623720138.rar D:迅雷下载codeNotes-master.zip D:迅雷下载DittoSetup_64bit_3_24_184_0.exe D:迅雷下载eclipse-inst-jre-win64.exe D:迅雷下载eclipse-jee-2021-09-R-win32-x86_64.zip D:迅雷下载fastjson-1.2.76.jar D:迅雷下载guava-30.1.1-jre.jar D:迅雷下载ideaIU-213.5605.12.exe D:迅雷下载imageglass_8.2.6.6_x64.msi D:迅雷下载latest-win64.zip.xltd D:迅雷下载latest-win64.zip.xltd.cfg D:迅雷下载layDate-v5.3.1.zip D:迅雷下载springboot-demo-maven-master.zip D:迅雷下载yx12345sqlyog.rar D:迅雷下载新建文件夹ideaIU-2021.1.1.exe D:迅雷下载新建文件夹note.txt四、扫描文件夹下指定类型文件
扫描D:迅雷下载文件夹下是jar、zip、txt类型的文件
public static void main(String[] args) {
String dir = "D:\迅雷下载\";
List filesType = Arrays.asList("jar","zip","txt");
List filesPath = SearchWord.getAllFilesPath(dir,filesType);
filesPath.forEach(System.out::println);
}
输出:
D:迅雷下载codeNotes-master.zip D:迅雷下载eclipse-jee-2021-09-R-win32-x86_64.zip D:迅雷下载fastjson-1.2.76.jar D:迅雷下载guava-30.1.1-jre.jar D:迅雷下载layDate-v5.3.1.zip D:迅雷下载springboot-demo-maven-master.zip D:迅雷下载新建文件夹note.txt五、扫描文件夹下指定类型文件,排除指定文件夹
扫描D:迅雷下载文件夹下是jar、zip、txt类型的文件,如果有文件夹名是 "新建文件夹"的则不扫描该文件夹下文件
public static void main(String[] args) {
String dir = "D:\迅雷下载\";
List filesType = Arrays.asList("jar","zip","txt");
List excludeDir = Arrays.asList("新建文件夹");
List filesPath = SearchWord.getAllFilesPath(dir,filesType,excludeDir);
filesPath.forEach(System.out::println);
}
输出:
D:迅雷下载codeNotes-master.zip D:迅雷下载eclipse-jee-2021-09-R-win32-x86_64.zip D:迅雷下载fastjson-1.2.76.jar D:迅雷下载guava-30.1.1-jre.jar D:迅雷下载layDate-v5.3.1.zip D:迅雷下载springboot-demo-maven-master.zip六、在指定文件中搜索字符串
在server.log文件中搜索insertData关键字
public static void main(String[] args) {
String filePath = "D:\迅雷下载\server.log";
String searchWord = "insertData";
Map map = SearchWord.scanFile(filePath,searchWord);
for(Map.Entry entry : map.entrySet()){
System.out.println("第"+entry.getKey()+"行:"+entry.getValue());
}
}
输出:
第67行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-开始插入数据库list大小:3 第68行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-nowadays:2021-12-27 15:10:42 第69行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-handleResult结束 第70行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-firm大小:15七、在文件夹下指定类型的文件中搜索字符串
在 D:迅雷下载 下所有"txt", "log"类型的文件中查找关键字insertData
public static void main(String[] args) {
String dir = "D:\迅雷下载\";
String searchStr = "insertData";
List fileType = Arrays.asList("txt", "log");
Map> map = SearchWord.searchFiles(dir, searchStr, fileType);
for (Map.Entry> m : map.entrySet()) {
System.out.println("文件路径: " + m.getKey());
for (Map.Entry n : m.getValue().entrySet()) {
System.out.println("第" + n.getKey() + "行:" + n.getValue());
}
System.out.println();
}
}
或者
public static void main(String[] args) {
SearchWord.searchAndPrint(dir,searchStr,fileType);
}
输出:
文件路径: D:迅雷下载server.log
第67行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-开始插入数据库list大小:3
第68行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-nowadays:2021-12-27 15:10:42
第69行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-handleResult结束
第70行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-firm大小:15
文件路径: D:迅雷下载新建文件夹note.txt
第15行:insertData-插入数据库
第17行:insertData-fserviceid:21-14
第19行:insertData-firmpv:1
第20行:insertData-firmuv:1
第21行:insertData-userpv:1
第22行:insertData-useruv:1
八、在文件夹下指定类型的文件中搜索字符串,排除指定文件夹
在 D:迅雷下载 文件夹下所有"txt", "log"类型的文件中查找关键字insertData,如果文件夹名为 “新建文件夹” 则排除该文件夹的搜索
public static void main(String[] args) {
String dir = "D:\迅雷下载\";
String searchStr = "insertData";
List fileType = Arrays.asList("txt", "log");
List excludeDir = Arrays.asList("新建文件夹"); //遇到文件夹名为"新建文件夹"则跳过该文件夹
Map> map = SearchWord.searchFiles(dir, searchStr, fileType, excludeDir);
for (Map.Entry> m : map.entrySet()) {
System.out.println("文件路径: " + m.getKey());
for (Map.Entry n : m.getValue().entrySet()) {
System.out.println("第" + n.getKey() + "行:" + n.getValue());
}
System.out.println();
}
}
输出:
文件路径: D:迅雷下载server.log 第67行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-开始插入数据库list大小:3 第68行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-nowadays:2021-12-27 15:10:42 第69行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-handleResult结束 第70行:[http-nio-8080-exec-339 2021 Dec 27 15:10:42]insertData-firm大小:15



