Java 如何使用静态方法搜索文件目录并返回对象?

Java 如何使用静态方法搜索文件目录并返回对象?,java,recursion,Java,Recursion,我正在努力学习如何编写实用程序类,但我不确定我所做的是否适合实用程序类。我对java还是一个新手,试图从概念上理解如何以及何时做某些事情 我有一个只有静态方法的类。我认为每当递归调用我的search()方法时,它原来拥有的数据就会丢失。我的课程设置如下: public class MyClassUtil { public static List<MyObjectData> findStuff(File path, List<String> listOfMyStu

我正在努力学习如何编写实用程序类,但我不确定我所做的是否适合实用程序类。我对java还是一个新手,试图从概念上理解如何以及何时做某些事情

我有一个只有静态方法的类。我认为每当递归调用我的
search()
方法时,它原来拥有的数据就会丢失。我的课程设置如下:

public class MyClassUtil {

    public static List<MyObjectData> findStuff(File path, List<String> listOfMyStuff) {
        String listAsString = convertListToString(listOfMyStuff);
        Pattern pattern = Pattern.compile(listAsString);

        List<MyObjectData> myObjectData = search(path, pattern);

        return myObjectData;
    }

    private static final String convertListToString(List<String> list) {

        // This method converts a given list to a string.  It works fine!
    }

    private static final List<MyObjectData> search(File directory, Pattern p) {

        List<MyObjectData> dataInFile = new ArrayList<MyStringData>();

        for (File file : directory.listFiles()) {
            if (file.isFile()) {
                try {
                    BufferedReader br = new BufferedReader(new FileReader(file));
                    String line;

                    while ((line = br.readLine()) != null) {
                        try {
                            Matcher m = p.matcher(line);
                            boolean found = m.find();

                            if (found) {
                                dataInFile.add(new MyObjectData(m.group(2), true));
                            }
                        } catch (Exception E) {
                            e.printStackTrace();
                        }
                    }
                    br.close();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
            if (file.isDirectory()) {
                search(file, p);
            }
            return dataInFile;
        }
    }
}
公共类MyClassUtil{
公共静态列表findStuff(文件路径,列表listOfMyStuff){
字符串listAsString=convertListToString(listOfMyStuff);
Pattern=Pattern.compile(listAsString);
列表myObjectData=搜索(路径、模式);
返回myObjectData;
}
私有静态最终字符串convertListToString(列表){
//此方法将给定列表转换为字符串。它工作正常!
}
私有静态最终列表搜索(文件目录,模式p){
List datainfle=new ArrayList();
对于(文件:directory.listFiles()){
if(file.isFile()){
试一试{
BufferedReader br=新的BufferedReader(新文件读取器(文件));
弦线;
而((line=br.readLine())!=null){
试一试{
匹配器m=p.匹配器(线);
布尔查找=m.find();
如果(找到){
添加(新的MyObjectData(m.group(2),true));
}
}捕获(例外E){
e、 printStackTrace();
}
}
br.close();
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
}
if(file.isDirectory()){
搜索(文件,p);
}
返回数据填充;
}
}
}

我没有得到任何回报(尽管我知道有些东西应该被归还)

问题在于您没有添加递归调用的结果

更改:

     if(file.isDirectory()) { search(file, p); }


您可以让递归代码将文件添加到传入的列表中。示例只列出了每个文件

private static void recursiveFill(List<File> files, File path) {
    if (path.isFile()) {
        files.add(path);
        return;
    }
    if (path.isDirectory()) {
        File[] innerFiles = path.listFiles();
        for (File file : innerFiles) {
            recursiveFill(files, file);
        }
    }
}

public static List<File> listFileIn(File path) {
    List<File> result = new ArrayList<File>();
    recursiveFill(result, path);
    return result;
}

public static void main(String[] args) {
    List<File> files = listFileIn(new File("."));
    for (File file : files) {
        System.out.println(file);
    }
}

并将这些结果合并到您返回的列表中。

您的问题是什么?@PhilippSander由于递归调用搜索方法(我想),我没有得到任何结果。我在这种情况下使用实用程序类有意义吗?哇,我被困在这个问题上一天多了,我不敢在这里问这个问题。非常感谢,这是我的问题。当然,为什么不呢。我可能会将其划分为专门的实用程序类,例如用于文件操作的
MyFileUtil
,以及用于字符串操作的
MyStringUtil
private static void recursiveFill(List<File> files, File path) {
    if (path.isFile()) {
        files.add(path);
        return;
    }
    if (path.isDirectory()) {
        File[] innerFiles = path.listFiles();
        for (File file : innerFiles) {
            recursiveFill(files, file);
        }
    }
}

public static List<File> listFileIn(File path) {
    List<File> result = new ArrayList<File>();
    recursiveFill(result, path);
    return result;
}

public static void main(String[] args) {
    List<File> files = listFileIn(new File("."));
    for (File file : files) {
        System.out.println(file);
    }
}
if(file.isDirectory()) { search(file, p); }