Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何';步行';java中的多个目录,具有多个文件扩展名?_Java_File_Search_Subtree - Fatal编程技术网

如何';步行';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);
}