使用 nio 的路径数组
Array of Path using nio
我正在研究 nio 主题并完成了以下任务:
使用 nio 递归搜索文件名。该方法应该 return 找到的路径列表。
当我 运行 下面的代码输出时,我只看到 [ ]。有人可以解释并纠正我吗?
public class Task01 {
public static void main(String[] args) throws IOException {
Path dir = Paths.get("C:\Users\......");
System.out.println(findFile(dir, "Task01.java"));
}
public static ArrayList<Path> findFile(Path path, String filename) throws IOException {
Path dir = Paths.get("C:\....");
ArrayList<Path> list1 = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, filename)) {
for (Path entry : stream) {
if (path.toFile().isDirectory()) {
findFile(path, filename);
} else list1.add(entry.toAbsolutePath());
}
}
return list1;
}
}
首先,在做递归的时候,要用entry
而不是path
,否则你是下不了目录树的
也使用 Files.newDirectoryStream(path)
而不是 Files.newDirectoryStream(path, fileNamePattern)
第二种方法在文件名与 fileNamePattern 匹配的路径中创建一个流,在你的情况下它将是空的 []
如果你的 Test.java
不在 path
public static void main(String[] args) throws IOException {
Path dir = Paths.get("E:\dev\...");
System.out.println(findFile(dir, "TestA.java"));
}
public static ArrayList<Path> findFile(Path path, String filename) throws IOException {
ArrayList<Path> list1 = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
for (Path entry : stream) {
if (Files.isDirectory(entry)) {
list1.addAll(findFile(entry, filename));
} else if(entry.getFileName().endsWith(filename)){
list1.add(entry.toAbsolutePath());
}
}
}
return list1;
}
此代码可能适合您:
public static ArrayList<Path> findFile(Path path, String filename) throws IOException {
ArrayList<Path> list1 = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path,filename)) {
for (Path entry : stream) {
System.out.println(entry+ "-"+entry.getFileName());
if (Files.isDirectory(entry)) {
list1.addAll(findFile(entry, filename));
}
else if (entry.getFileName().toString().equals(filename))
list1.add(entry.toAbsolutePath());
}
}
return list1;
}
- 将文件名传递给 Files.newDirectoryStream(path,filename) 时,它只会搜索路径本身,不会搜索子目录。所以你可能不会在这里传递文件名来过滤。
- 如果递归调用方法,还必须确保向上传递 return 值:
list1.addAll(findFile(entry, filename));
- 在 for 循环中始终使用
entry
,而不是 path
,否则您不会递归处理目录结构。 (参见 Files.isDirectory(entry)
而不是 path.toFile().isDirectory()
更新:改进了 java.nio API 的用法(感谢@Andreas)。没错,我不太熟悉 nio
api.
我正在研究 nio 主题并完成了以下任务: 使用 nio 递归搜索文件名。该方法应该 return 找到的路径列表。 当我 运行 下面的代码输出时,我只看到 [ ]。有人可以解释并纠正我吗?
public class Task01 {
public static void main(String[] args) throws IOException {
Path dir = Paths.get("C:\Users\......");
System.out.println(findFile(dir, "Task01.java"));
}
public static ArrayList<Path> findFile(Path path, String filename) throws IOException {
Path dir = Paths.get("C:\....");
ArrayList<Path> list1 = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, filename)) {
for (Path entry : stream) {
if (path.toFile().isDirectory()) {
findFile(path, filename);
} else list1.add(entry.toAbsolutePath());
}
}
return list1;
}
}
首先,在做递归的时候,要用entry
而不是path
,否则你是下不了目录树的
也使用 Files.newDirectoryStream(path)
而不是 Files.newDirectoryStream(path, fileNamePattern)
第二种方法在文件名与 fileNamePattern 匹配的路径中创建一个流,在你的情况下它将是空的 []
如果你的 Test.java
不在 path
public static void main(String[] args) throws IOException {
Path dir = Paths.get("E:\dev\...");
System.out.println(findFile(dir, "TestA.java"));
}
public static ArrayList<Path> findFile(Path path, String filename) throws IOException {
ArrayList<Path> list1 = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
for (Path entry : stream) {
if (Files.isDirectory(entry)) {
list1.addAll(findFile(entry, filename));
} else if(entry.getFileName().endsWith(filename)){
list1.add(entry.toAbsolutePath());
}
}
}
return list1;
}
此代码可能适合您:
public static ArrayList<Path> findFile(Path path, String filename) throws IOException {
ArrayList<Path> list1 = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path,filename)) {
for (Path entry : stream) {
System.out.println(entry+ "-"+entry.getFileName());
if (Files.isDirectory(entry)) {
list1.addAll(findFile(entry, filename));
}
else if (entry.getFileName().toString().equals(filename))
list1.add(entry.toAbsolutePath());
}
}
return list1;
}
- 将文件名传递给 Files.newDirectoryStream(path,filename) 时,它只会搜索路径本身,不会搜索子目录。所以你可能不会在这里传递文件名来过滤。
- 如果递归调用方法,还必须确保向上传递 return 值:
list1.addAll(findFile(entry, filename));
- 在 for 循环中始终使用
entry
,而不是path
,否则您不会递归处理目录结构。 (参见Files.isDirectory(entry)
而不是path.toFile().isDirectory()
更新:改进了 java.nio API 的用法(感谢@Andreas)。没错,我不太熟悉 nio
api.