需求:递归遍历一个目录,筛选出需要查找的文件类型 实现:分别用Java流式实现和递归实现 代码:
package hello; import java.io.File; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; /** * Description: * <p> * * @author shuvidora * @date 2019/6/12 12:27 */ class WalkTree { /** * 流式实现筛选指定目录下指定类型的文件 */ public void walkTree() { Path start = FileSystems.getDefault().getPath("src"); try { Files.walk(start) .filter(path -> path.toFile().isFile()) .filter(path -> path.toString().endsWith(".java")) .forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } } /** * 默认只扫描当前文件夹 * @param f */ public void filterFileType(File f) { filterFileType(f, false); } /** * * @param file * @param isRecursive 是否递归子文件夹 */ public void filterFileType(File file, boolean isRecursive) { if (file.isDirectory()) { File[] files = file.listFiles(); for (File f : files) { if (f.isFile()) { if (f.getName().endsWith(".java")) { System.out.println(f.getName()); } } else if(isRecursive && f.isDirectory()) { filterFileType(f, true); } } } } } // 枚举实现单例模式,线程安全,非延迟加载 enum FileUtils { INSTANCE; private WalkTree instance; FileUtils() { instance = new WalkTree(); } // 默认private构造方法 public WalkTree getInstance() { return instance; } } public class FileTest { public static void main(String[] args) { FileUtils main = FileUtils.INSTANCE; WalkTree walkTree = main.getInstance(); //walkTree.walkTree(); //1 File file = new File("src"); walkTree.filterFileType(file, true); //2 } }
输出:
//1 src\hello\Counter.java src\hello\FileTest.java src\housekeeping\Burrito.java //2 Counter.java FileTest.java Burrito.java