File我们出看可能会根据字面意思理解为文件,其实它既代表文件又代表目录。
这里有一个例子可以列出指定目录下的所有文件或目录, 以及我们可以过滤得到我们想要的文件
import java.io.File; import java.io.FilenameFilter; import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.regex.Pattern; 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(); } } public class Test{ public static void main(String[] args) { File path = new File("/home/estar/Test"); String[] list = path.list(); System.out.println("输出全部文件或目录:"); for (String s : list) { System.out.println(s); } System.out.println("输出以.java结尾的文件或目录"); list = path.list(new DirFilter(".*\.java")); //只列出以.java结尾的文件 for (String s : list) { System.out.println(s); } System.out.println("匿名内部类实现"); list = path.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { Pattern pattern = Pattern.compile(".*\.java"); return pattern.matcher(name).matches(); } }); for (String s : list) { System.out.println(s); } } } 输出: 输出全部文件或目录: a.java cd e.txt b.java c.java d.java 输出以.java结尾的文件或目录 a.java b.java c.java d.java 匿名内部类实现 a.java b.java c.java d.java
更加实用的工具类:
import java.io.File; import java.io.FilenameFilter; import java.io.ObjectInputStream.GetField; import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.regex.Pattern; class FileUtils{ //获得本地指定目录下的,指定格式的目录列表 public static File[] local(File dir, final String regex) { return dir.listFiles(new FilenameFilter() { 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 dir, String name) { return local(new File(dir), name); } public static class TreeInfo implements Iterable<File> { List<File> files = new ArrayList<File>(); List<File> dirs = new ArrayList<File>(); public void addAll(TreeInfo info) { files.addAll(info.files); dirs.addAll(info.dirs); } @Override public Iterator<File> iterator() { return files.iterator(); } @Override public String toString() { return files.toString() + " " + dirs.toString(); } } //得到所有目录 public static TreeInfo getInfo(String path, String regex) { return recurseDirs(new File(path), regex); } public static TreeInfo getInfo(File path, String regex) { return recurseDirs(path, regex); } public static TreeInfo getInfo(String path) { return recurseDirs(new File(path), ".*"); } public static TreeInfo getInfo(File path) { return recurseDirs(path, ".*"); } //递归调用然后获得信息 public 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 { //System.out.println("item : = " + item); if (item.getName().matches(regex)) { result.files.add(item); } } } return result; } } public class Test{ public static void main(String[] args) { System.out.println(Arrays.asList(FileUtils.local(new File("/home/estar/Test"), ".*\.java"))); System.out.println("指定目录下的所有目录:"); System.out.println(FileUtils.getInfo(new File("/home/estar/Test")).dirs); System.out.println("指定目录下的所有文件:"); System.out.println(FileUtils.getInfo("/home/estar/Test").files); System.out.println("指定目录下的所有内容:"); System.out.println(FileUtils.getInfo("/home/estar/Test")); System.out.println("指定目录下的,特定文件:"); System.out.println(FileUtils.getInfo(new File("/home/estar/Test"), ".*\.java").files); } } 输出: [/home/estar/Test/a.java, /home/estar/Test/b.java, /home/estar/Test/c.java, /home/estar/Test/d.java] 指定目录下的所有目录: [/home/estar/Test/cd] 指定目录下的所有文件: [/home/estar/Test/a.java, /home/estar/Test/cd/q.java, /home/estar/Test/e.txt, /home/estar/Test/b.java, /home/estar/Test/c.java, /home/estar/Test/d.java] 指定目录下的所有内容: [/home/estar/Test/a.java, /home/estar/Test/cd/q.java, /home/estar/Test/e.txt, /home/estar/Test/b.java, /home/estar/Test/c.java, /home/estar/Test/d.java] [/home/estar/Test/cd] 指定目录下的,特定文件: [/home/estar/Test/a.java, /home/estar/Test/cd/q.java, /home/estar/Test/b.java, /home/estar/Test/c.java, /home/estar/Test/d.java]