如何';步行';java中的多个目录,具有多个文件扩展名?
下面是我的实际代码,它工作得非常完美:如何';步行';java中的多个目录,具有多个文件扩展名?,java,file,search,subtree,Java,File,Search,Subtree,下面是我的实际代码,它工作得非常完美: String sHomeDir是我唯一可以开始扫描的文件夹 字符串sExt是要搜索的唯一扩展名 try (Stream<Path> walk = Files.walk(Paths.get(sHomeDir))) { List<String> result = walk.map(x -> x.toString()) .filter(f -> f.endsWith(sExt)).collect(Col
String sHomeDir是我唯一可以开始扫描的文件夹
字符串sExt是要搜索的唯一扩展名
try (Stream<Path> walk = Files.walk(Paths.get(sHomeDir)))
{
List<String> result = walk.map(x -> x.toString())
.filter(f -> f.endsWith(sExt)).collect(Collectors.toList());
...
} catch (IOException e) {
e.printStackTrace();
}
try(streamwalk=Files.walk(path.get(sHomeDir)))
{
列表结果=walk.map(x->x.toString())
.filter(f->f.endsWith(sExt)).collect(collector.toList());
...
}捕获(IOE异常){
e、 printStackTrace();
}
为了使用:-要扫描的多个文件夹(带子树)
-多个文件扩展名要搜索要处理多个目录,可以对它们进行流式处理,并将它们平面映射到单个路径流。
try (Stream<Path> walk = Files.walk(Paths.get(sHomeDir)))
{
List<String> result = walk.map(x -> x.toString())
.filter(f -> f.endsWith(sExt)).collect(Collectors.toList());
...
} catch (IOException e) {
e.printStackTrace();
}
要处理多个扩展名,只需对照所有扩展名检查文件:
public static List<String> multiWalk
(Collection<String> directories, Collection<String> extensions) {
return directories.stream()
.flatMap(d -> {
try {
return Files.walk(Paths.get(d));
} catch (IOException e) {
return Stream.empty();
}
})
.map(Object::toString)
.filter(f -> extensions.stream().anyMatch(f::endsWith))
.collect(Collectors.toList());
}
公共静态列表多行
(集合目录、集合扩展){
返回目录.stream()
.flatMap(d->{
试一试{
返回文件.walk(path.get(d));
}捕获(IOE异常){
返回Stream.empty();
}
})
.map(对象::toString)
.filter(f->extensions.stream().anyMatch(f::endsWith))
.collect(Collectors.toList());
}
我想使用与“File.list()”方法一起使用的FilenameFilter。我找到了一个样品
导入java.io.File;
导入java.io.FileFilter;
导入java.io.FilenameFilter;
/**
*
*@见:https://stackoverflow.com/questions/5751335/using-file-listfiles-with-filenameextensionfilter
*
*设置过滤器,如:
*私有静态最终扩展filenamefilter IMAGE\u FILTER=
新的扩展文件名过滤器(“.png”、“.jpg”、“.bmp”);
*
*/
公共类扩展FilenameFilter实现FilenameFilter{
私有字符[][]扩展;
公共扩展名FileNameFilter(字符串…扩展名)
{
int length=extensions.length;
this.extensions=新字符[长度][];
用于(字符串s:扩展名)
{
this.extensions[--length]=s.toCharArray();
}
}
@凌驾
公共布尔接受(文件目录,字符串名称){
char[]path=name.toCharArray();
for(字符[]扩展名:扩展名)
{
if(extension.length>path.length)
{
继续;
}
int pStart=path.length-1;
int eStart=extension.length-1;
布尔成功=真;
对于(int i=0;i{
列表路径名=新建ArrayList();
List filenames=Arrays.asList(walkPath.toFile().List(新扩展名filenamefilter(“jpg”、“tif”、“bmp”));
filenames.forEach(fn->{
add(String.format(“%s/%s”,walkPath.toFile().toString(),fn));
});
返回路径名;
})
.forEach(imagefiles::addAll);
forEach(System.out::println);
}
是的。首先要弄清楚如何过滤多个扩展。您好@Mureinik,谢谢您的建议。我不得不这样修改平面图部分:.flatmap(新函数,因为编译器说:lambda body既不兼容value也不兼容void…或者更好…添加'return null;'语句。我编辑了code@Cruxial很可能Mureinik打算使用returnstream.empty()
在catch块中,虽然我个人会抛出一个未选中的异常
。是的,我错过了那里的返回
。谢谢编辑!
public void walkList(String path) throws IOException {
List<String> imagefiles = new ArrayList<>();
Files.walk(Paths.get(path))
.filter(Files::isDirectory)
.map(walkPath -> {
List<String> pathnames = new ArrayList<>();
List<String> filenames = Arrays.asList(walkPath.toFile().list(new ExtensionsFilenameFilter("jpg", "tif", "bmp")));
filenames.forEach(fn -> {
pathnames.add(String.format("%s/%s", walkPath.toFile().toString(), fn));
});
return pathnames;
})
.forEach(imagefiles::addAll);
imagefiles.forEach(System.out::println);
}