2

假设我的项目的位置是“some/random/guy”,在项目内部有一个目录,路径为“some/random/guy/versions”,我想获取该文件夹中的所有文件/目录所以我可以获得所有可用的版本。但是版本目录只有在项目编译后才会创建,所以它不在我的 IDE 中。

在搜索了 2 个小时之后,我找不到我的答案。

目前我正在使用 oracle 文档中的代码,但它也不起作用:

try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get("some/random/guy/versions"))) {
        for (Path file: stream) {
            System.out.println(file.getFileName());
        }
    } catch (IOException | DirectoryIteratorException e) {
        System.err.print(e);
    }

如何获取位于 jar 文件内的任何文件夹中的所有文件/目录?

如果可能,我想避免解压缩 jar 文件,谢谢。

4

2 回答 2

1

此代码将显示使用 NIO 文件系统处理的任何 jar/zip 存档的内容,您需要传入 jar 的位置和 jar 下的可选路径:

public static void main(String[] args) throws IOException {
    Path jar = Path.of(args[0]);
    String relPath = args.length > 1 ? args[1] : "/";

    System.out.println("ZIP/JAR: "+jar+" isRegularFile()="+Files.isRegularFile(jar));

    try (FileSystem fs = FileSystems.newFileSystem(jar)) {
        Path path = fs.getPath(relPath);
        System.out.println("SCAN "+ jar+" starting at path: "+path);

        try(Stream<Path> str = Files.find(path, Integer.MAX_VALUE, (p,a) -> true)) {
            str.forEach(System.out::println);
        }
    }
}
于 2020-10-23T15:44:46.227 回答
0

jar文件是普通的旧zip档案。您不需要解压缩jar来获取所有条目的名称,因为zip文件包含CentralDirectory. 您只需要使用标准ZipInputStream或框架之一,例如zip4jvm

import ru.olegcherednik.zip4jvm.ZipMisc;

public static List<String> getAllEntryNames(Path jar) throws IOException {
    return ZipMisc.zip(jar).getEntries()
                  .map(ZipFile.Entry::getFileName)
                  .collect(Collectors.toList());
}

此代码段检索所有现有的条目名称。目录(如果它们作为单独的条目存在)以 . 结尾/

于 2020-10-23T15:55:01.777 回答