递归获取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));
}
我正在尝试从给定的 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));
}