java实现在指定目录中查找字符串

本贴最后更新于 4215 天前,其中的信息可能已经事过境迁

用法

Usage: java JSearch -t str [-options]
options:
	 -d directory	 要查找的子目录,默认是当前目录
	 -f file	 要查找的文件,默认所有txt和sql文件,支持正则
	 -t targetStr	 将要查找的目标字符串,不可空,支持正则
	 -c charset	 字符编码
	 -r		 递归查找子目录
示例:
java JSearch -t t00ls
java JSearch -t t00ls -d /root/test/txt -f .*\.txt -c gbk -r


代码


package pw.tly.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JSearch {
private static String path = "";
private static String filename = ".\.(txt|sql)";
private static String targetStr = "";
private static String charset = "";
private static boolean isSearchSubdirectory = false;
private static String usage = "Usage: java JSearch -t str [-options]\noptions:\n\t -d directory\t 要查找的子目录,默认是当前目录\n\t -f file\t 要查找的文件,默认所有 txt 和 sql 文件,支持正则\n\t -t targetStr\t 将要查找的目标字符串,不可空,支持正则\n\t -c charset\t 字符编码\n\t -r\t\t 递归查找子目录\n 示例:\njava JSearch -t t00ls\njava JSearch -t t00ls -d /root/test/txt -f .
\.txt -c gbk -r";

public static void main(String[] args) {
	if(!parseArgs(args)){
		return;
	}
	List<File> list = getFiles(path, filename, isSearchSubdirectory);
	find(list);
}

/**
 * 在文件中查找字符串并输出
 * @param list 文件列表
 */
private static void find(List<File> list) {
	for (File file : list) {
		String result = find(file.getAbsolutePath());
		if("".equals(result)){
			continue;
		}
		System.out.println("**********在" + file.getAbsolutePath() + "中找到:**********");
		System.out.println(result);
	}
}

/**
 * 在文件中查找字符串
 * @param filename 文件路径
 * @return 查找结果
 */
private static String find(String filename) {
	if(targetStr == null || targetStr.length() == 0) {
		throw new RuntimeException("目标字符串不能为空");
	}
	BufferedReader br = null;
	InputStreamReader isr = null;
	FileInputStream fis = null;
	String line = null;
	String result = "";
	try {
		fis = new FileInputStream(filename);
		isr = "".equals(charset) ? new InputStreamReader(fis) : new InputStreamReader(fis, charset);
		br = new BufferedReader(isr);
		
		Pattern pattern = Pattern.compile(targetStr);
		
		while((line = br.readLine()) != null){
			Matcher matcher = pattern.matcher(line);
			if(matcher.find()){
				result += line + "\n";
			}
		}
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (UnsupportedEncodingException e) {
		System.out.println("编码无效");
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		if(fis != null){
			try {
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if(isr != null){
			try {
				isr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if(br != null){
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	return result;
}

/**
 * 获取某一路径下的所有符合条件的文件
 * @param path 路径
 * @param filename 文件名过滤条件
 * @param isSearchSubdirectory 是否查找子目录
 * @return 文件列表
 */
private static List<File> getFiles(String path, final String filename, boolean isSearchSubdirectory) {
	List<File> result = new ArrayList<File>();
	File file = new File(path).getAbsoluteFile();
	if(!file.exists()){
		return result;
	}
	if(file.isFile()){
		result.add(file);
		return result;
	}
	
	File[] files = file.listFiles(new FileFilter() {
		
		@Override
		public boolean accept(File file) {
			if(!file.getAbsoluteFile().isDirectory()){
				if("".equals(filename)){
					return true;
				}
				if(file.getAbsoluteFile().getName().matches(filename)){
					return true;
				}
			}
			return false;
		}
		
	});
	result.addAll(Arrays.asList(files));
	
	if(isSearchSubdirectory){
		File[] directorys = file.listFiles(new FileFilter() {
			
			@Override
			public boolean accept(File file) {
				if(file.getAbsoluteFile().isDirectory()){
					return true;
				}
				return false;
			}
			
		});
		
		for (File directory : directorys) {
			List<File> list = getFiles(directory.getAbsolutePath(), filename, isSearchSubdirectory);
			result.addAll(list);
		}
	}
	
	return result;
}

/**
 * 解析参数
 * @param args 参数数组
 * @return 解析是否成功
 */
private static boolean parseArgs(String[] args) {
	if(args.length == 0){
		System.out.println(usage);
		return false;
	}
	try {
		for (int i = 0; i < args.length; i++) {
			if("-d".equals(args[i])){
				path = args[i + 1];
			}
			if("-f".equals(args[i])){
				filename = args[i + 1];
			}
			if("-t".equals(args[i])){
				targetStr = args[i + 1];
			}
			if("-c".equals(args[i])){
				charset = args[i + 1];
			}
			if("-r".equals(args[i])){
				isSearchSubdirectory = true;
			}
		}
		if("".equals(targetStr)){
			System.out.println("请用-t参数指定要查找的字符串");
			return false;
		}
		return true;
	} catch (Exception e) {
		System.out.println(usage);
		return false;
	}
}

}

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    Linux 下面的话,脚本效率应该要高一点。

  • 其他回帖
  • someone

    试过在 linux 下用这个查 400 多 M800 多万行的文件,大概要十秒

推荐标签 标签

  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 406 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 1 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 164 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 476 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖 • 1 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    6 引用 • 63 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 100 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 66 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 374 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖 • 1 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 168 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 212 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 29 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 391 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 1 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 762 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 94 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖