1.1目录列表器:
package com.java.io; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; public class DirList { public static void main(String[] args) { //System.out.println(System.getProperty("user.dir")); //E:workspaceworkspace for j2eeMyTest //“.”知识代表当前工作目录的意思,它是一个相对路径的写法 File path = new File("."); String [] list; if(args.length == 0){ list = path.list(); }else{ list = path.list(new DirFilter(args[0])); } Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); for(String dirItem : list){ System.out.println(dirItem); } } } class DirFilter implements FilenameFilter{ private Pattern pattern; public DirFilter(String regex){ pattern = Pattern.compile(regex); } @Override public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }
以参数: .*.txt 运行,输出:
option.txt
test.txt
zip.txt
匿名内部类:
package com.java.io; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; public class DirList2 { public static FilenameFilter filter(final String regex){ return new FilenameFilter(){ private Pattern pattern = Pattern.compile(regex);; @Override public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }; } public static void main(String[] args) { File path = new File("."); String [] list; if(args.length == 0){ list = path.list(); }else{ list = path.list(filter(args[0])); } Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); for(String dirItem : list){ System.out.println(dirItem); } } }
进一步修改,定义作为list()参数的匿名内部类,程序会变得更小:
package com.java.io; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; public class DirList3 { public static void main(final String[] args) { File path = new File("."); String [] list; if(args.length == 0){ list = path.list(); }else{ list = path.list(new FilenameFilter(){ private Pattern pattern = Pattern.compile(args[0]); @Override public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }); } Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); for(String dirItem : list){ System.out.println(dirItem); } } }
1.2目录实用工具
package com.java.io; 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; import com.java.util.PPrint; public final class Directory { /** * local方法使用listFiles()来产生File数组 * 如果需要List而不是数组,你可以使用Arrays.asList()自己对结果进行转换。 * @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); @Override public boolean accept(File dir, String name) { return pattern.matcher(new File(name).getName()).matches(); } }); } 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<File>(); public List<File> dirs = new ArrayList<File>(); @Override public Iterator<File> iterator() { return files.iterator(); } void addAll(TreeInfo other){ files.addAll(other.files); dirs.addAll(other.dirs); } @Override public String toString() { return "dirs: " + PPrint.pformat(dirs) + " files: " + 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(File start){ return recurseDirs(start, ".*"); } public static TreeInfo walk(String start){ return recurseDirs(new File(start), ".*"); } static TreeInfo recurseDirs(File startDir, String regex){ TreeInfo result = new TreeInfo(); for(File item : startDir.listFiles()){ if(item.isDirectory()){ result.dirs.add(item); 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)); } } } }
package com.java.util; import java.util.Arrays; import java.util.Collection; public class PPrint { public static String pformat(Collection<?> c){ if(c.size() == 0){ return "[]"; } StringBuilder result = new StringBuilder("["); for(Object elem : c){ if(c.size() != 1){ result.append(" "); } result.append(elem); } if(c.size() != 1){ result.append(" "); } result.append("]"); return result.toString(); } public static void pprint(Collection<?> c){ System.out.println(pformat(c)); } public static void pprint(Object[] c){ System.out.println(pformat(Arrays.asList(c))); } }
运行Directory.java:
1.3目录的检查及创建
File类不仅仅只代表存在的文件或目录。也可以用File对象来创建新的目录或尚不存在的整个目录路径。我们还可以查看文件的特性(如:大小,最后修改日期,读/写) ,检查某个File对象代表的是一个文件还是一个目录,井可以删除文件。下面的示例展示了File类的一些其他方法
package com.java.io; import java.io.File; public class MakeDirectories { private static void usage() { System.err.println( "Usage:MakeDirectories pathl ... " + "Creates each path " + "Usage:MakeDirectories -d pathl ... " + "Deletes each path " + "Usage:MakeDirectories -r pathl path2 " + "Renames from pathl to path2"); System.exit(1); } private static void fileData(File f) { System.out.println( "Absolute path: " + f.getAbsolutePath () + " Can read: " + f.canRead () + " Can write: " + f .canWrite() + " getName: " + f.getName() + " getParent: " + f.getParent() + " getPath: "+ f.getPath() + " length: " + f.length() + " lastModified: " + f.lastModified()); if(f. isFile()){ System.out.println("It's a file"); } else if(f.isDirectory()){ System.out.println("It's a directory"); } } public static void main(String[] args) { if(args.length < 1) usage(); if(args[0] .equals("-r")) { if(args.length != 3) usage(); File old = new File(args[1]); File rname = new File(args[2]); //用来把一个文件重命名(或移动)别由参数所指示的另一个完愈不肉的薪路经(也就是另一个File对象)节窟。 old.renameTo(rname); fileData (old); fileData(rname) ; return; } int count = 0; boolean del = false; if(args[0].equals("-d")) { count++; del = true; } count--; while(++count < args.length) { File f = new File(args[count]); if (f. exists()) { System.out. println(f + " exists") ; if (del) { System.out.println("deleting...." + f); f.delete(); } }else{ if(!del){ f.mkdirs(); System.out.println("created " + f); } } fileData( f) ; } } }
运行参数:test:
运行参数:-r test test2
test文件夹被重命名为test2
运行参数 -d test2
test2文件夹被删除:
----------------------------