您当前的位置: 首页 >  Java

蓝不蓝编程

暂无认证

  • 0浏览

    0关注

    706博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

蓝不蓝编程 发布时间:2014-06-19 21:45:22 ,浏览量:0

转自:http://symphony.b3log.org/article/1368190290825

用法

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 list = getFiles(path, filename, isSearchSubdirectory);
		find(list);
	}
	
	/**
	 * 在文件中查找字符串并输出
	 * @param list 文件列表
	 */
	private static void find(List 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 getFiles(String path, final String filename, boolean isSearchSubdirectory) {
		List result = new ArrayList();
		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 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;
		}
	}
}
关注
打赏
1639405877
查看更多评论
立即登录/注册

微信扫码登录

0.0424s