递归获取java文件并存入arraylist

Get jave files recursively and store in array list

我正在尝试从给定的 directory 及其所有 subdirectories 中获取所有 .java-files。我提出了一个递归解决方案,该解决方案 prints 出我想要的所有文件,但我的实际目标是将所有 paths 存储到 array 中,以便我可以使用它们。存储它们是我目前挣扎的地方。这是我的代码:

public static ArrayList<String> getJavaFiles(Path path) throws CodeValidationException {


    ArrayList<String> files = new ArrayList<String>();

    DirectoryStream<Path> stream = null;
    try {

        stream = Files.newDirectoryStream(path);
        for (Path entry : stream) {
            if (Files.isRegularFile(entry)) {
                if(entry.getFileName().toString().endsWith(".java")) {

                    boolean isRegularExecutableFile = Files.isRegularFile(entry)
                            && Files.isReadable(entry);
                    //&& Files.isExecutable(entry) -> not working

                    if(isRegularExecutableFile) { 
                        System.out.println("path: " + entry);
                        files.add(entry.getFileName().toString());
                    }
                };

            } else if (Files.isDirectory(entry)) {
                getJavaFiles(entry);
            }

        }

        return files;


    } catch (IOException e) {

        throw new CodeValidationException(String.format("error reading folder %s: %s", path, e.getMessage()), e);

    } finally {
        if(stream != null) {
            try {
                stream.close();
            } catch (IOException e) {

            }
        }
    }

}

编辑:

这是一个例子:

本文来自getJavaFiles:

path: /Users/chris/Uni Bamberg/3. Semester/AJP/Assignment1/Assignment1/src/de/uniba/wiai/dsg/ajp/assignment1/Main.java

path: /Users/chris/Uni Bamberg/3. Semester/AJP/Assignment1/Assignment1/src/de/uniba/wiai/dsg/ajp/assignment1/validation/impl/SimpleCodeValidator.java

path: /Users/chris/Uni Bamberg/3. Semester/AJP/Assignment1/Assignment1/src/de/uniba/wiai/dsg/ajp/assignment1/validation/impl/TaskValidation.java

path: /Users/chris/Uni Bamberg/3. Semester/AJP/Assignment1/Assignment1/src/de/uniba/wiai/dsg/ajp/assignment1/validation/CodeValidationException.java

path: /Users/chris/Uni Bamberg/3. Semester/AJP/Assignment1/Assignment1/src/de/uniba/wiai/dsg/ajp/assignment1/validation/ValidationResult.java

path: /Users/chris/Uni Bamberg/3. Semester/AJP/Assignment1/Assignment1/src/de/uniba/wiai/dsg/ajp/assignment1/validation/Warning.java

path: /Users/chris/Uni Bamberg/3. Semester/AJP/Assignment1/Assignment1/src/de/uniba/wiai/dsg/ajp/assignment1/validation/CodeValidator.java

path: /Users/chris/Uni Bamberg/3. Semester/AJP/Assignment1/Assignment1/src/de/uniba/wiai/dsg/ajp/assignment1/validation/ValidationTask.java

path: /Users/chris/Uni Bamberg/3. Semester/AJP/Assignment1/Assignment1/src/de/uniba/wiai/dsg/ajp/assignment1/validation/WarningType.java

path: /Users/chris/Uni Bamberg/3. Semester/AJP/inputFile.java

但是当打印出我从函数中得到的 ArrayList 时,我得到的是:

for(int i = 0; i < files.size(); i++) {   
    System.out.print(files.get(i)); 
}

/Users/chris/Uni Bamberg/3. Semester/AJP/inputFile.java

您的代码不起作用,因为您只是检查第一个目录,而没有在子目录中添加文件。在您的 else-if 中您再次调用 getJavaFiles(entry) 但您没有将从它返回的列表添加到现有列表中:

else if (Files.isDirectory(entry)) {
            getJavaFiles(entry);
    }

您可以像这样将它们添加到您的列表中:

else if (Files.isDirectory(entry)) {
            files.addAll(getJavaFiles(entry));
     }