Java 流处理-按名称搜索给定目录中的文件/dir
我目前正在做一项工作,其中包括创建一个实用程序类,该类使用一种方法,允许在给定(作为参数)目录中按名称搜索文件/目录 演练是,我有义务在函数编程/流处理领域内这样做 我曾尝试使用Java 流处理-按名称搜索给定目录中的文件/dir,java,file,java-8,functional-programming,java-stream,Java,File,Java 8,Functional Programming,Java Stream,我目前正在做一项工作,其中包括创建一个实用程序类,该类使用一种方法,允许在给定(作为参数)目录中按名称搜索文件/目录 演练是,我有义务在函数编程/流处理领域内这样做 我曾尝试使用.walk()和.find()来实现这一点,但没有效果 public static List<File> findFile(Path path, String name) throws IOException{ return Files.walk(path) .filter(
.walk()
和.find()
来实现这一点,但没有效果
public static List<File> findFile(Path path, String name) throws IOException{
return Files.walk(path)
.filter(n -> n.getFileName().toString().equals(name))
.map(n -> n.toFile())
.collect(Collectors.toList());
}
publicstaticlist findFile(路径、字符串名)引发IOException{
返回文件.walk(路径)
.filter(n->n.getFileName().toString().equals(name))
.map(n->n.toFile())
.collect(Collectors.toList());
}
退房
虽然看起来您只是在尝试搜索一个特定的文件,但这并不是执行此任务的最佳代码。无论如何,您的文件应该位于数组的第一个位置。或者制作一些讨厌的dir.listFiles()
List listOfFiles=Files.List(path.get(path))
.filter(e->e.getFileName().endsWith(名称))
.map(n->n.toFile()).collect(collector.toList());
注:
根据您的要求调整过滤条件。我假设name
有一个类似.txt的值,因此listOfFiles
将包含以.txt结尾的所有文件walk
方法将对您有效,但在开始时转换为file允许您使用getName
方法,该方法将文件
名称作为字符串返回
public static List<File> findFile(Path path, String name) throws IOException{
return Files
.walk(path)
.map(Path::toFile) //.map(p -> p.toFile())
.filter(File::isFile) //.filter(f -> f.isFile())
.filter(f -> f.getName().equals(name))
.collect(Collectors.toList());
}
publicstaticlist findFile(路径、字符串名)引发IOException{
返回文件
.步行(小径)
.map(路径::toFile)/.map(p->p.toFile())
.filter(文件::isFile)/.filter(f->f.isFile())
.filter(f->f.getName().equals(name))
.collect(Collectors.toList());
}
请注意,提供的名称必须与文件(包括其扩展名)完全相同,否则函数将找不到它如何传递参数值。你们能不能显示路径和文件名的值以更好地帮助我们。你们应该更具体地说明“但它不起作用”。你遇到了什么问题?谢谢@Nicholas!这就是我所了解的更清晰的版本:返回Arrays.stream(path.toFile().listFiles()).filter(n->n.getName().equals(name)).collect(Collectors.toList());我忘了提一下,我想让它递归-你知道我如何实现它吗?递归?你能给我一个你想要达到的目标的例子吗?我的意思是,如果我正确理解FIles.list(),它将不会在文件树中找到具有给定名称且“更深”的文件。我想让它不仅返回path文件夹中的文件名,还返回path/foo/和path/foo/bar等文件名。@NicholasK现在,轮到OP解释他们遇到的实际问题。@hobbledehoy:回答了你的这部分问题。FilenameFilter
可以用lambda表达式表示。
List<File> listOfFiles = Files.list(Paths.get(path))
.filter(e -> e.getFileName().endsWith(name))
.map(n -> n.toFile()).collect(Collectors.toList());
public static List<File> findFile(Path path, String name) throws IOException{
return Files
.walk(path)
.map(Path::toFile) //.map(p -> p.toFile())
.filter(File::isFile) //.filter(f -> f.isFile())
.filter(f -> f.getName().equals(name))
.collect(Collectors.toList());
}