java编程思想笔记(十一)文件和目录的操作
程序员文章站
2022-03-15 12:36:54
...
1.文件目录的List操作:
Java中,File类其实代表文件的路径,它既可以代表一个特定文件的文件,也可以代表一个包含多个文件的目录名称。如果File代表目录,可以使用List列出目录中文件。
import java.util.regex.*; import java.io.*; import java.util.*; public class DirList{ public static void main(String[] args){ //当前目录 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); } //File的List方法回调方法 public boolean accept(File dir, String name){ //使用正则表达式匹配给定目录下的文件名 return pattern.matcher(name).matches(); } }
命令行输入参数:“*\.java”
输出结果如下:
DirFilter.java
DirList.java
2.java中除了File类可以表示文件的路径外,还可以表示目录的路径,可以通过File的isDirectory判断File对象是一个文件还是一个目录。
如下的例子通过local()方法列出给定目录中符合条件的文件/目录名称,walk()方法遍历给定的目录:
import java.util.regex.*; import java.io.*; import java.util.*; public final class Directory{ //列出目录中符合条件的文件名 public static File[] local(File dir, final String regex){ return dir.listFiles(new FilenameFilter(){ private Pattern pattern = Pattern.compile(regex); 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>(); //默认的迭代器方法,跌倒文件树元素对象 public Iterator<File> iterator(){ return files.iterator(); } void addAll(TreeInfo other){ files.addAll(other.files); dirs.addAll(other.dirs); } public String toString(){ return “dirs: ” + dirs + “\n\nfiles: ” + 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; } }
这里的关键方法:
File的listFiles()方法,可以得到当前File目录下的所有文件或目录的File。
3.文件和目录的其他操作:
文件和目录除了常规的查找和遍历操作意外,还有很多其他的操作,例如:创建、删除、判断文件/目录是否已存在,获取文件/目录的绝对路径,获取文件/目录的权限等等,下面的小例子就展示文件/目录的这些操作:
import java.io.*; public class MakeDirectories{ //获取文件/目录的基本信息 private static void fileData(File f){ System.out.println( “Absolute path: ” + f.getAbsolutePath() + “\n Can read: ” + f.canRead() + “\n Can write: ” + f.canWrite() + “\n getName: ” + f.getName() + “\n getParent: ” + f.getParent() + “\n getPath: ” + f.getPath() + “\n length: ” + f.length() + “\n lastModified: ” + f.lastModifed()); if(f.isFile()){ System.out.println(f.getName() + “ is a file”); } else if(f.isDirectory()){ System.out.println(f.getName() + “ is a directory”); } } public static void main(String[] args){ File old = new File(“oldFile”); File new = new File(“newFile”); old.renameTo(new); fileData(old); fileData(new); File d = new File(“/test”); if(d.exists()){ System.out.println(“Deleting …” + d); d.delete(); } else { System.out.prinln(“Creating…” + d); d.mkdirs(); } } }
上一篇: exist和in的区别和使用场景