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

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

用法

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

    3200 引用 • 8216 回帖

相关帖子

欢迎来到这里!

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

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

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

  • someone

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

推荐标签 标签

  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • IBM

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

    17 引用 • 53 回帖 • 144 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 10 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • Follow
    4 引用 • 12 回帖 • 13 关注
  • Openfire

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

    6 引用 • 7 回帖 • 105 关注
  • CodeMirror
    2 引用 • 17 回帖 • 162 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 141 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 1 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    174 引用 • 3852 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 248 关注
  • Ngui

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

    7 引用 • 9 回帖 • 397 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 63 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • PHP

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

    180 引用 • 408 回帖 • 486 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    184 引用 • 1018 回帖 • 2 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 35 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 3 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 446 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    95 引用 • 901 回帖
  • sts
    2 引用 • 2 回帖 • 227 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖 • 1 关注
  • 叶归
    6 引用 • 17 回帖 • 14 关注
  • IPFS

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

    21 引用 • 245 回帖 • 228 关注
  • Log4j

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

    20 引用 • 18 回帖 • 30 关注