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 }

java中的File类

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 }
View Code

相关文章: