【问题标题】:Copy/extract directory from resources inside Jar file从 Jar 文件中的资源中复制/提取目录
【发布时间】:2017-02-04 07:29:39
【问题描述】:

我正在编写一个需要从其资源目录中复制一些静态资产的应用程序。目录结构是这样的;

java/
resources/
    assets/
        file1.txt
        file2.txt
        subdir/
            file3.txt

我想将 assets 目录(递归)复制到文件系统上的某个位置。如果我使用IOUtils.copy(InputStream in, OutputStream out),那么我会得到一个空指针异常。

InputStream in = getClass().getResourceAsStream("/assets");
OutputStream out = new FileOutputStream(new File("/path/to/write/to"));
IOUtils.copy(in, out);

Exception in thread "main" java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2146)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:2102)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2123)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:2078)

但是,如果我将输入和输出流更改为文件而不是目录,那么它可以正常复制。

有没有办法将作为 jar 一部分的目录递归复制到文件系统?

【问题讨论】:

  • 是的,谢谢,但是我有点想避免将资产压缩到自己的文件中。有没有办法在不这样做的情况下递归复制目录?

标签: java file-io


【解决方案1】:

将所有资产文件放入一个 zip 文件中,如 Reddymails 链接的问题中所述,是一种很好的方法。

如果您想将资产文件作为单独的条目保存在 .jar 中,问题是您将没有要列出的目录:

您可以在打包之前让您的构建过程在一个文本文件中列出条目(毕竟您知道它们是什么),然后将该文本文件包含在您的 .jar 中。然后在运行时复制它们就像从该文件中读取一样简单:

Path assetDir = /* ... */;

try (BufferedReader listFile = new BufferedReader(
        new InputStreamReader(
            getClass().getResourceAsStream("assets-list.txt"),
            StandardCharsets.UTF_8))) {

    String assetResource;
    while ((assetResource = listFile.readLine()) != null) {
        Path assetFile = assetDir.resolve(assetResource);
        Files.createDirectories(assetFile.getParent());
        try (InputStream asset = getClass().getResourceAsStream(assetResource)) {
            Files.copy(asset, assetFile);
        }
    }
}

【讨论】:

    【解决方案2】:

    如果有人还在寻找这个,我只是共享了一个完全执行此操作的类:将资源目录复制到文件系统中的目标位置。可以在这里找到:https://stackoverflow.com/a/58318009/738968

    【讨论】:

    • 您的回答应该注意,当且仅当资源位于 jar 文件中时,它才会起作用。类加载器可以从 jar 文件以外的其他东西加载资源。
    • @toolforger 感谢您的澄清。欢迎您的贡献。
    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2022-11-25
    • 2016-02-18
    • 2021-11-21
    相关资源
    最近更新 更多