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

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

用法

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3170 引用 • 8209 回帖

相关帖子

欢迎来到这里!

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

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

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

  • 其他回帖
  • someone

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

推荐标签 标签

  • 工具

    子曰:“工欲善其事,必先利其器。”

    285 引用 • 728 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 130 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 2 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 3 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    11 引用 • 90 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 9 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 65 回帖 • 454 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 499 关注
  • Git

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

    207 引用 • 358 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 52 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • OnlyOffice
    4 引用 • 7 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 5 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 246 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖 • 2 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    21201 引用 • 83545 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    344 引用 • 1778 回帖 • 1 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 257 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 454 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 634 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 6 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 343 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖