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

时间:2013-09-03 11:05:00

标签: java recursion

我试图学习如何编写实用程序类,而且我不确定我尝试做的是否是实用程序类的一个很好的候选者。我对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;
        }
    }
}

我没有得到任何回报(虽然我知道应该退回一些东西)。

2 个答案:

答案 0 :(得分:1)

问题是你没有添加递归调用的结果。

更改:

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

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

答案 1 :(得分:1)

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

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); }

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