深度优先和广度优先搜索文件

本文提供了一种在Java项目中查找并管理Java文件的方法,包括获取指定路径下的所有Java文件,以及深度优先和广度优先搜索Java文件的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
* @author haoguo
* @version 2014/12/09
*/
public class JavaFileArray {
    /**
     * 过滤获取目录与java文件
     */
    private static FileFilter filter = new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isDirectory()
                    || (pathname.isFile() && pathname.getName().endsWith(
                            ".java"));
        }
    };
    /**
     * 默认获取程序路径下的所有java文件列表
     *
     * @return
     */
    public static List<File> getJavaFilesList() {
        return Arrays.asList(getJavaFiles(new File(System
                .getProperty("user.dir"))));
    }
    /**
     * 获取指定的路径path下的所有java文件列表
     *
     * @param path
     * @return
     */
    public static List<File> getJavaFilesList(String path) {
        return Arrays.asList(getJavaFiles(new File(path)));
    }
    /**
     * 获取指定parent下的所有java文件列表
     *
     * @param parent
     * @return
     */
    public static List<File> getJavaFilesList(File parent) {
        return Arrays.asList(getJavaFiles(parent));
    }
    /**
     * 默认获取程序路径下的所有java文件File数组
     *
     * @return
     */
    public static File[] getJavaFiles() {
        return getJavaFiles(new File(System.getProperty("user.dir")));
    }
    /**
     * 获取指定的路径path下的所有java文件File数组
     *
     * @param path
     * @return
     */
    public static File[] getJavaFiles(String path) {
        return getJavaFiles(new File(path));
    }
    /**
     * 获取指定parent下的所有java文件File数组
     *
     * @param parent
     * @return
     */
    public static File[] getJavaFiles(File parent) {
        List<File> javaFiles = new ArrayList<File>();
        File[] files = parent.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory()
                        || (pathname.isFile() && pathname.getName().endsWith(
                                ".java"));
            }
        });
        for (File file : files) {
            if (file.isFile()) {
                javaFiles.add(file);
            } else {
                File[] subsFiles = getJavaFiles(file);
                for (File subFile : subsFiles) {
                    javaFiles.add(subFile);
                }
            }
        }
        return javaFiles.toArray(new File[0]);
    }
    public static File[] getTargetFiles() {
        return getTargetFiles(new File(System.getProperty("user.dir")),
                new ArrayList<File>());
    }
    public static List<File> getTargetFilesList() {
        return Arrays.asList(getTargetFiles());
    }
    /**
     * 采用静态过滤器方式获取parent下的所有java文件File数组
     *
     * @param parent
     * @return
     */
    public static File[] getTargetFiles(File parent, List<File> javaFiles) {
        File[] files = parent.listFiles(filter);
        for (File file : files) {
            if (file.isFile()) {
                javaFiles.add(file);
            } else {
                getTargetFiles(file, javaFiles);
            }
        }
        return javaFiles.toArray(new File[0]);
    }
    /**
     * 深度优先搜索
     *
     * @param parentFile
     * @param fileName
     * @return
     */
    public static File findDepthFile(File parentFile, String fileName) {
        File[] files = parentFile.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                if (file.getName().equals(fileName))
                    return file;
            } else {
                File subFile = findDepthFile(file, fileName);
                if (subFile != null) {
                    return subFile;
                }
            }
        }
        return null;
    }
    /**
     * 广度(层次)优先搜索
     *
     * @param parentFile
     * @param fileName
     * @return
     */
    public static File findBreadthFile(File parentFile, String fileName) {
        final String name = fileName;
        FileFilter filter = new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory()
                        || (pathname.isFile() && pathname.getName()
                                .equals(name));
            }
        };
        File[] files = parentFile.listFiles(filter);
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            if (file.isFile()) {
                if (file.getName().equals(fileName)) {
                    return file;
                }
            } else {
                File[] tmp = file.listFiles(filter);
                if (tmp == null || tmp.length == 0) {
                    continue;
                }
                files = Arrays.copyOf(files, files.length + tmp.length);
                System.arraycopy(tmp, 0, files, files.length - tmp.length,
                        tmp.length);
            }
        }
        return null;
    }
    /**
     * 深度优先搜索
     *
     * @param fileName
     * @return
     */
    public static File findDepthFile(String fileName) {
        File parentFile = new File(System.getProperty("user.dir"));
        return findDepthFile(parentFile, fileName);
    }
    /**
     * 广度(层次)优先搜索
     *
     * @param fileName
     * @return
     */
    public static File findBreadthFile(String fileName) {
        File parentFile = new File(System.getProperty("user.dir"));
        return findBreadthFile(parentFile, fileName);
    }
    public static void main(String[] args) {
        // File[] file = getTargetFiles(new
        // File(System.getProperty("user.dir")));
        File[] file = getJavaFiles(new File(System.getProperty("user.dir")));
        for (File f : file) {
            System.out.println(f);
        }
        System.out.println(Arrays.asList(file));
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值