java中的File类其实和文件并没有多大关系,它更像一个对文件路径描述的类。它即可以代表某个路径下的特定文件,也可以用来表示该路径的下的所有文件,所以我们不要被它的表象所迷惑。对文件的真正操作,还得需要I/O流的实现。
1.目录列表
如果我们想查看某个目录下有那些文件和目录,我们可以使用File中提供的list方式来查看,这很像linux下的ls命令。
查看E:/html文件夹下所有的php文件,执行的时候输入的参数为正则表达式
1 package com.dy.xidian; 2 3 import java.io.File; 4 import java.io.FilenameFilter; 5 import java.util.Arrays; 6 import java.util.regex.Pattern; 7 8 public class DirList { 9 static File path = new File("E:/html"); 10 public static void main(String[] args) { 11 String[] list; 12 // 获取整个目录列表 13 if (args.length == 0) 14 list = path.list(); 15 else 16 list = path.list(new DirFilter(args[0])); 17 Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); 18 for (String string : list) { 19 System.out.println(string); 20 } 21 } 22 } 23 24 class DirFilter implements FilenameFilter { 25 private Pattern pattern; 26 public DirFilter(String regex) { 27 pattern = Pattern.compile(regex); 28 } 29 30 public boolean accept(File dir, String name) { 31 // find匹配的是字符串的子序列,我们可以认为是不严格匹配 32 return pattern.matcher(name).find(); 33 } 34 }
2.目录实用工具
该工具有两个作用
- 遍历所有目录及其子目录
- 遍历目录下的文件以及其子目录下的文件
1 package com.dy.xidian; 2 3 import java.io.File; 4 import java.io.FilenameFilter; 5 import java.util.ArrayList; 6 import java.util.Iterator; 7 import java.util.List; 8 import java.util.regex.Pattern; 9 10 import net.mindview.util.PPrint; 11 12 public final class Diractory { 13 public static File[] local(File dir, final String regex) { 14 return dir.listFiles(new FilenameFilter() { 15 Pattern pattern = Pattern.compile(regex); 16 @Override 17 public boolean accept(File dir, String name) { 18 return pattern.matcher(new File(name).getName()).matches(); 19 } 20 }); 21 } 22 23 public static File[] local(String path, final String regex) { 24 return local(new File(path), regex); 25 } 26 27 public static class TreeInfo implements Iterable<File> { 28 public List<File> files = new ArrayList<File>(); 29 public List<File> dirs = new ArrayList<File>(); 30 31 @Override 32 public Iterator<File> iterator() { 33 return files.iterator(); 34 } 35 36 void addAll(TreeInfo other) { 37 files.addAll(other.files); 38 dirs.addAll(other.dirs); 39 } 40 41 public String toString() { 42 return "dirs: " + PPrint.pformat(dirs) + "\n\nfiles:" 43 + PPrint.pformat(files); 44 } 45 } 46 47 public static TreeInfo walk(String start, String regex) { 48 return recurseDirs(new File(start), regex); 49 } 50 51 public static TreeInfo walk(File start, String regex) { 52 return recurseDirs(start, regex); 53 } 54 55 public static TreeInfo walk(File start) { 56 return recurseDirs(start, ".*"); 57 } 58 59 public static TreeInfo walk(String start) { 60 return recurseDirs(new File(start), ".*"); 61 } 62 63 public static TreeInfo recurseDirs(File startDir, String regex) { 64 TreeInfo result = new TreeInfo(); 65 for (File file : startDir.listFiles()) { 66 if (file.isDirectory()) { 67 result.dirs.add(file); 68 result.addAll(recurseDirs(file, regex)); //加入子目录信息 69 } else if (file.getName().matches(regex)) 70 result.files.add(file); 71 } 72 return result; 73 } 74 75 public static void main(String[] args) { 76 if (args.length == 0) 77 System.out.println(walk(".")); 78 else 79 for (String arg : args) { 80 System.out.println(walk(arg)); 81 } 82 } 83 }