问题描述
我正在研究nio主题,并完成了以下任务: 使用nio递归搜索文件名。该方法应返回找到的Path的列表。 当我在输出中运行以下代码时,我只会看到 [] 。有人可以解释和纠正我吗?
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)时,它将仅在路径本身中搜索,没有子目录。因此,您可能无法在此处传递文件名进行过滤。
- 如果您递归调用方法,则还必须确保返回值向上传递:
list1.addAll(findFile(entry,filename));
for循环内的 - 始终与
entry
一起使用,而不与path
一起使用,否则,您将不会递归处理目录结构。 (请参见Files.isDirectory(entry)
而非path.toFile().isDirectory()
更新:改进了java.nio API的用法(由于@Andreas)。是的,我对nio
api不太熟悉。