当前位置: 首页 > 知识库问答 >
问题:

如何使用文件。步行。。。根据条件获取文件图表?

易烨磊
2023-03-14

我有以下目录结构:

/path/to/stuff/org/foo/bar/
/path/to/stuff/org/foo/bar/1.2.3/
/path/to/stuff/org/foo/bar/1.2.3/myfile.ext
/path/to/stuff/org/foo/bar/1.2.4/
/path/to/stuff/org/foo/bar/1.2.4/myfile.ext
/path/to/stuff/org/foo/bar/blah/
/path/to/stuff/org/foo/bar/blah/2.1/
/path/to/stuff/org/foo/bar/blah/2.1/myfile.ext
/path/to/stuff/org/foo/bar/blah/2.2/
/path/to/stuff/org/foo/bar/blah/2.2/myfile.ext

我想得到以下输出:

/path/to/stuff/org/foo/bar/
/path/to/stuff/org/foo/bar/blah/

我有以下代码(如下),这是低效的,因为它打印出来:

/path/to/stuff/org/foo/bar/
/path/to/stuff/org/foo/bar/
/path/to/stuff/org/foo/bar/blah/
/path/to/stuff/org/foo/bar/blah/

以下是Java代码:

public class LocatorTest
{

    @Test
    public void testLocateDirectories()
            throws IOException
    {
        long startTime = System.currentTimeMillis();

        Files.walk(Paths.get("/path/to/stuff/"))
             .filter(Files::isDirectory)
             .forEach(Foo::printIfArtifactVersionDirectory);

        long endTime = System.currentTimeMillis();

        System.out.println("Executed in " + (endTime - startTime) + " ms.");
    }

    static class Foo
    {

        static void printIfArtifactVersionDirectory(Path path)
        {
            File f = path.toAbsolutePath().toFile();
            List<String> filePaths = Arrays.asList(f.list(new MyExtFilenameFilter()));

            if (!filePaths.isEmpty())
            {
                System.out.println(path.getParent());
            }
        }

    }

}

过滤器:

public class MyExtFilenameFilter
        implements FilenameFilter
{

    @Override
    public boolean accept(File dir, String name)
    {
        return name.endsWith(".ext");
    }

}

共有3个答案

凤明朗
2023-03-14

除了@a-bet-oliver的回答,下面是如果您的操作声明了IOExceptions,您可以做的事情。

您可以将过滤后的流视为一个Iterable,然后对每个循环执行常规操作。这样,就不必在lambda中处理异常。

java prettyprint-override">try (Stream<Path> pathStream = Files
        .walk(Paths.get("/path/to/stuff/"))
        .filter(p -> p.toString().endsWith(".ext"))
        .map(p -> p.getParent().getParent())
        .distinct()) {

    for (Path file : (Iterable<Path>) pathStream::iterator) {
        // something that throws IOException
        Files.copy(file, System.out);
    }
}

在这里找到了窍门:https://stackoverflow.com/a/32668807/1207791

濮阳茂材
2023-03-14

您正在为所有访问的目录调用方法printifactversiondirectory。我做了一点小小的改变,让事情变得显而易见:

static void printIfArtifactVersionDirectory(Path path) {
    System.out.println("--- " + path);
    ...
}

有了这些额外的输出,您将获得:

--C:\Projects\材料
--C:\Projects\材料\org
--C:\Projects\材料\org\foo
--C:\Projects\材料\org\foo\bar
--C:\Projects\材料\org\foo\bar\1.2.3
--C:\Projects\材料\org\foo\bar
---C:\Projects\材料\org\foo\bar\1.2.4
C:\Projects\材料\org\foo\bar
---C:\Projects\材料\org\foo\bar\blah
---C:\Projects\材料\org\foo\bar\blah\2.1
C:\Projects\材料\org\foo\bar\blah
---C:\Projects\材料\org\foo\bar\blah\2.2
C:\Projects\材料\org\foo\bar\blah

因此,只要有工件版本目录,就可以经常获得输出。如果你想记住你已经为一个目录做了输出,你必须把这些信息存储在某个地方。一个快速实施方案可以是:

static class Foo {
    private static final Set<Path> visited = new HashSet<>();

    static void printIfArtifactVersionDirectory(Path path) {
        ...
        Path parent = path.getParent();
        if (!filePaths.isEmpty() && !visited.contains(parent)) {
            visited.add(parent);
            System.out.println(parent);
        }
    }
}

这样,您就可以获得预期的输出:

C:\项目\东西\org\foo\bar
C:\项目\东西\org\foo\bar\blah

一个更好的解决方案是使用集合来存储访问过的父母,并且只有在访问过他们之后才打印它们:

static class PathStore {
    private final Set<Path> store = new HashSet<>();

    void visit(Path path) {
        File f = path.toAbsolutePath().toFile();
        List<String> filePaths = Arrays.asList(f.list(new MyExtFilenameFilter()));
        if (!filePaths.isEmpty()) {
            store.add(path.getParent());
        }
    }

    void print() {
        store.forEach(System.out::println);
    }
}

用法:

PathStore pathStore = new PathStore();
Files.walk(Paths.get("/path/to/stuff/"))
        .filter(Files::isDirectory)
        .forEach(pathStore::visit);
pathStore.print();
云瑞
2023-03-14
Files.walk(Paths.get("/path/to/stuff/"))
     .filter(p -> p.toString().endsWith(".ext"))
     .map(p -> p.getParent().getParent())
     .distinct()
     .forEach(System.out::println);

这将过滤所有具有扩展名的文件,并获取其目录的父路径distinct确保每个路径只使用一次。

 类似资料:
  • 我有以下数据帧: 我希望获得行ID,其中。 预期收益为。 有什么想法吗?

  • 问题内容: 我想获取基于条件选择的数据帧行数。我尝试了以下代码。 输出: 输出显示数据帧中每一列的计数。相反,我需要获得满足以上所有条件的单一计数?这该怎么做?如果您需要有关我的数据框的更多说明,请告诉我。 问题答案: 您要的是所有条件都为真的条件,所以答案是len,除非我误解了您的要求

  • 问题内容: 我正在制作一个基本的文件浏览器,并希望显示每个文件的图标。有什么办法可以做到这一点? 问题答案:

  • 问题内容: 我在jmeter.properties文件中做了以下更改: 但是仍然找不到我的.csv文件在哪里。 谁能帮帮我吗。 问题答案: 除了在jmeter.properties中完成的配置外: 1)GUI: 汇总报告结果配置 2)CLI: 在test.csv您将获得CSV格式的结果。

  • 当我使用相对路径时,我可以从Eclipse运行Java程序。但是,当我将其作为JAR文件运行时,该路径不再有效。在我的src/components/SettingsWindow中。我有:

  • 问题内容: 为了下载文件,我正在创建一个urlopen对象(urllib2类)并分块读取它。 我想多次连接到服务器,并在六个不同的会话中下载文件。这样做,下载速度应该会更快。许多下载管理器都具有此功能。 我考虑过在每次会话中指定要下载的文件部分,并以某种方式在同一时间处理所有会话。我不确定如何实现这一目标。 问题答案: 听起来您想使用可用的HTTP Range 风格之一。 编辑 更新的链接以指向w