策略模式(回调函数)

拟墨画扇 提交于 2019-12-04 02:21:35
/**
 * 
 */
package com.zachary.io.util;

import java.io.File;
import java.io.IOException;

/**
 * @author Zachary.Zheng
 * @version 1.0
 * @date 2019年11月9日
 */
public class ProcessFiles {
	public interface Strategy{
		void process(File file);
	}
	private Strategy strategy;
	private String ext;
	public ProcessFiles(Strategy strategy, String ext) {
		super();
		this.strategy = strategy;
		this.ext = ext;
	}
	public ProcessFiles() {
		super();
	}

	public void start(String [] args) {
		try {
			if(args.length == 0) {
				processDirectoryTree(new File("."));
			} else {
				for (String arg : args) {
					File fileArg = new File(arg);
					if(fileArg.isDirectory()) {
						processDirectoryTree(fileArg);
					} else {
						if(!arg.endsWith("." + ext)) {
							arg += "." + ext;
						}
						strategy.process(new File(arg).getCanonicalFile());
					}
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	public void processDirectoryTree(File root) throws IOException {
		for(File file: Directory.walk(root.getAbsolutePath(), ".*\\."+ext)) {
			strategy.process(file.getCanonicalFile());
		}
	}
	public static void main(String[] args) {
		new ProcessFiles(new ProcessFiles.Strategy() {
			public void process(File file) {
				System.out.println(file);
			}
		}, "java").start(args);;
	}
}

  

/** *  */package com.zachary.io.util;
import java.io.File;import java.io.FilenameFilter;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.regex.Pattern;
/** * @author Zachary.Zheng * @version 1.0 * @date 2019年11月9日 */public class Directory {/** * 获取能匹配正则的文件夹名 * @param dir * @param regex * @return */public static File[] local(File dir, final String regex) {return dir.listFiles(new FilenameFilter() {private Pattern pattern = Pattern.compile(regex);@Overridepublic boolean accept(File dir, String name) {return pattern.matcher(new File(name).getName()).matches();}});}/** * 获取能匹配正则的文件夹名 * @param path * @param regex * @return */public static File[] local(String path, final String regex) {return local(new File(path), regex);}public static class TreeInfo implements Iterable<File> {// 文件名称路径public List<File> files = new ArrayList<>();// 文件夹路径public List<File> dirs = new ArrayList<>();@Overridepublic Iterator<File> iterator() {return files.iterator();}void addAll(TreeInfo other) {files.addAll(other.files);dirs.addAll(other.dirs);}@Overridepublic String toString() {return "TreeInfo [dirs=" + PPrint.pformat(dirs) + ", \n\nfiles=" + PPrint.pformat(files) + "]";}}public static TreeInfo walk(String start, String regex) {return recurseDirs(new File(start), regex);}public static TreeInfo walk(File start, String regex) {return recurseDirs(start, regex);}public static TreeInfo walk(String start) {return recurseDirs(new File(start), ".*");}public static TreeInfo walk(File start) {return recurseDirs(start, ".*");}// 获取目录树static TreeInfo recurseDirs(File startDir, String regex) {TreeInfo result = new TreeInfo();// 文件夹也可以过滤for (File item : Directory.local(startDir, ".*")) {if(item.isDirectory()) {result.dirs.add(item);/* * 1.文件夹下面是文件夹 递归调用, 直到没有发现文件夹为止. * 2.将子文件夹中的目录结构复制给父文件夹 */result.addAll(recurseDirs(item, regex));} else {if(item.getName().matches(regex)) {result.files.add(item);}}}return result;}public static void main(String[] args) {if(args.length == 0) {System.out.println(walk("."));} else {for (String arg : args) {System.out.println(walk(arg));}}}}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!