java I/O之File类:遍历目录树

时间:2021-11-17 12:36:52

     《Java编程思想》第十八章看到的一个工具类,觉得有些作用,mark一下,主要是对一个指定目录下所有的文件进行遍历,主要代码如下:

public class FileUtils {
	public static File[] local(File dir,final String regex){
		return dir.listFiles(new FilenameFilter(){
			Pattern pattern  = Pattern.compile(regex);
	
			@Override
			public boolean accept(File dir, String name) {
				// TODO Auto-generated method stub
				return pattern.matcher(name).matches();
			}
			
		});
	}
	
	public static File[] local(String path,String regex){
		return local(new File(path),regex);
	}
	
	public static class TreeInfo{
		private  ArrayList<File> files = new ArrayList<File>();
		private  ArrayList<File> dirs = new ArrayList<File>();
		
		public  void addAll(TreeInfo other){
			files.addAll(other.files);
			dirs.addAll(other.dirs);
		}
		
		public  TreeInfo walk(String startDir,String regex){
			return recurseDirs(new File(startDir),regex);
		}
		
		public TreeInfo walk(File startFile,String regex){
			return recurseDirs(startFile,regex);
		}
		
		public TreeInfo walk(File startFile){
			return recurseDirs(startFile,".*");
		}
		
		public TreeInfo recurseDirs(File filename,String regex){
			TreeInfo results = new TreeInfo();
			File[] filenames = local(filename,regex);
			for(File file:filenames){
				if(file.isDirectory()){
					results.dirs.add(file);
					addAll(recurseDirs(file,regex));
				}else{
					results.files.add(file);
				}
			}
			return results;
		}
	}
	
	public static void main(String[] args) {
		File file = new File("D:\\maven\\helloworld");
		System.out.println("|--"+file.getName());
		TreeInfo fileTree = new TreeInfo();
		TreeInfo tree = fileTree.walk(file);
		ptintTree(tree,1);
	}

	private static void ptintTree(TreeInfo tree,int level) {
		String prefix = "";
		for(int i = 0;i < level;i++){
			prefix += "  ";
		}
		prefix += "|--";
		for(File f:tree.dirs){
			System.out.println(prefix+f.getName());
			ptintTree(new TreeInfo().walk(f),level + 1);
		}
		for(File f:tree.files){
			System.out.println(prefix+f.getName());
		}
	}
}

用本地的一个maven工程测试输出结果如下:

|--helloworld
  |--src
    |--main
      |--java
        |--easymorse
          |--com
            |--App.java
    |--test
      |--java
        |--easymorse
          |--com
            |--AppTest.java
  |--target
    |--classes
      |--easymorse
        |--com
          |--App.class
    |--maven-archiver
    |--test-classes
      |--easymorse
        |--com
          |--AppTest.class
    |--helloworld-1.0-SNAPSHOT.jar
  |--.classpath
  |--.project
  |--pom.xml