网站首页 > java教程 正文
之前通过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类库下载地址:
* https://pan.baidu.com/s/1A0sU0EdbPHOcnCjz0E4TjA?pwd=tzh4
*/
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 <F> 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<Path>() {
@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;
}
}
运行结果:
好了,欢迎小伙伴们留言评论。
猜你喜欢
- 2024-11-18 「LeetCode」数组拆分Java题解
- 2024-11-18 「Java基础知识」string是什么?
- 2024-11-18 Java设置字符串的首字母为大写
- 2024-11-18 100个Java工具类之2:字符串之多种个性化格式处理
- 2024-11-18 LeetCode力扣官方题解|842将数组拆分成斐波那契序列
- 2024-11-18 从字符串拆分获取字符数组查看字符串是否有子字符串contains方法
- 2024-11-18 Java—Throwing Exceptions
- 2024-11-18 JAVA String类
- 2024-11-18 JAVA系列之:String的特点是什么?它有哪些重要的方法?
- 2024-11-18 Spring Boot 项目如何按模块进行拆分?
你 发表评论:
欢迎- 最近发表
-
- 搞趣网:我的世界全新皮肤包原始居民下载地址
- 我的世界拔刀剑MOD下载(我的世界拔刀剑mod下载国际版)
- 我的世界无正版账号的简单联机方法(非网易版,仅适用于局域网)
- 一些可以显著提高大型 Java 项目启动速度的尝试
- 常见的java敏感异常介绍(java 常见的异常)
- Java 开发者必看!三招实现外部 Jar 包动态加载(含热更新方案)
- Java JAR 启动内存参数配置指南:从基础设置到性能优化
- 对Spring MVC接口进行Mock测试(springmvc对外接口)
- 还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS
- 干掉OpenFeign,SpringBoot 3.0 自带的 HTTP 客户端真香!
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)