之前通过PHP实现了多级目录下查找文件是否含有某个字符串的功能,就想着最近在开发JAVA项目,用JAVA语言能不能也开发一个呢?于是乎就动手开干。
想知道PHP的功能实现请查看我之前的文章:
以下是JAVA语言实现代码:
package com.yzf.findword;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Locale;
import java.util.Scanner;
import java.util.function.Consumer;
/**
* @author yzf~
* @version 1.0
* 在目录文件中查找指定字符
* EncodingDetect类库下载地址:
*
*/
public class FindWordInFile {
private static int fileCount = 0;//查找到的文件数量
private String findWord = "";//需要查找的字串
private String result = "";//查找的结果
private String notes = "";//提示语
private boolean isFindMore = false;//是否多级目录下查找,默认不开启
/**
* main入口
*/
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查找的字符串[查找多个请用竖线“|”隔开]:");
String word = scanner.next();
System.out.println("请输入查找的目录或文件[支持多级目录查找]:");
String path = scanner.next();
System.out.println("是否在多级目录下寻找[y/n]:");
String isFindMore = scanner.next();
FindWordInFile fileObj = new FindWordInFile(word, isFindMore);
fileObj.findWordInDir(path);
System.out.println(fileObj.getResult());
}
/**
* 构造器
* @param findWord
*/
public FindWordInFile(String findWord, String isFindMore){
this.findWord = findWord;
this.isFindMore = isFindMore.toUpperCase(Locale.ROOT).equals("Y") ? true : false;
}
/**
* 在文件中查找特定字符
* @param files 查找的文件绝对路径
*/
public void findWordInFile(F files) throws IOException {
File file = null;
String path = "";
if (files instanceof Path) {
file = ((Path) files).toFile();
path = file.getPath();
} else {
file = new File((String) files);
path = (String) files;
}
if (!(file.exists() && file.isFile())) {
notes += path + " [非文件]";return;
}
if (findWord.isEmpty() || "".equals(findWord)) {
notes += path + "查找字符不能为空";return;
}
if (file.length() == 0) {
notes += path + " [空文件]";return;
}
//获得文件编码格式
String fileCode = EncodingDetect.getJavaEncode(path);
fileCode = fileCode!=null&&!"".equals(fileCode) ? fileCode : "UTF8";
//读取文件数据
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), fileCode));
//将字符串通过竖线|分割,以支持多个字符串查询
String[] strArr = findWord.split("\\|");
String readRes = null;//用于存储读到的结果
//遍历字符串数组
for (int i = 0; i < strArr.length; i++) {
int line = 1;//记录行数
while ((readRes = br.readLine()) != null) {//读取一行
int location = readRes.indexOf(strArr[i]);//匹配字符串是否在该行中
if ( location != -1 ) {//判断匹配结果
result += path+" [第 "+line+" 行的第"+location+"位查找到字符:"+strArr[i]+"]\r\n";
break;//匹配到字符串,进入下一个字符串匹配
}
line++;
}
}
br.close();//关闭资源
if ("".equals(result)) {
notes += "文件中没有查找到指定字符";return;
}
}
/**
* 在目录文件下中查找特定字符
* @param path 查找的文件绝对路径
*/
public void findWordInDir(String path) throws IOException {
//判断路径是否位目录
File dir = new File(path);
if (dir.isDirectory()) {//目录
File[] files;
if (this.isFindMore) {//多级目录下查找
files = dir.listFiles();
for (File file :files) {
if (file.isDirectory()) {
findWordInDir(file.toString());
} else {
findWordInFile(file.toString());
}
}
} else {//当前目录文件下查找
Files.list(Paths.get(path)).filter(Files::isRegularFile).forEach(new Consumer() {
@Override
public void accept(Path path) {
try {
findWordInFile(path);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
} else if (dir.isFile()) {//文件
findWordInFile(path);
}
}
public String getResult() {
return result;
}
public String getNotes() {
return notes;
}
}
运行结果:
好了,欢迎小伙伴们留言评论。
海报
0 条评论
145
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~