File类
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) + " files:" 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 }
3.目录的检查及创建
File的更倾向于对目录、文件属性的操作,比如路径,存在性,大小,修改时间、读/写权限等,对文件的内容并不关心。
1 package com.dy.xidian; 2 3 import java.io.File; 4 5 public class MakeDirectories { 6 private static void usage() { 7 System.err.println("Usage: MakeDirectories path1... " 8 + "Creates each path " 9 + "Usage: MakeDirectories -d path1... " + "Delete each path " 10 + "Usage: MakeDirectories -r path1 path2 " 11 + "Renames from path1 to path2"); 12 System.exit(1); 13 } 14 15 private static void fileData(File f) { 16 System.out.println("Absolute path: " + f.getAbsolutePath() 17 + " Can read: " + f.canRead() + " Can write: " 18 + f.canWrite() + " getName: " + f.getName() 19 + " getParent: " + f.getParent() + " getPath: " 20 + f.getPath() + " length: " + f.length() 21 + " lastModified: " + f.lastModified()); 22 if (f.isFile()) 23 System.out.println("It is a file"); 24 else if (f.isDirectory()) 25 System.out.println("It is a directory"); 26 } 27 28 public static void main(String args[]) { 29 if (args.length < 1) 30 usage(); 31 if (args[0].equals("-r")) { 32 if (args.length != 3) 33 usage(); 34 //文件重命名,若文件名冲突,则命名函数执行失败 35 File old = new File(args[1]), rname = new File(args[2]); 36 old.renameTo(rname); 37 fileData(old); 38 fileData(rname); 39 return; 40 } 41 int count = 0; 42 boolean del = false; 43 if (args[0].equals("-d")) { 44 count++; 45 del = true; 46 } 47 count--; 48 while (++count < args.length) { 49 File f = new File(args[count]); 50 if (f.exists()) { 51 System.out.println(f + " existd"); 52 if (del) { 53 System.out.println("deleting..." + f); 54 f.delete(); 55 } 56 } else if (!del) { 57 f.mkdirs(); 58 System.out.println("create " + f); 59 } 60 fileData(f); 61 } 62 } 63 }
该代码能够进行目录/文件的创建,删除,重命名操作.