Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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/2/google-app-engine/4.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 从Jar文件内的资源复制/提取目录_Java_File Io - Fatal编程技术网

Java 从Jar文件内的资源复制/提取目录

Java 从Jar文件内的资源复制/提取目录,java,file-io,Java,File Io,我正在编写一个应用程序,需要从其资源目录复制一些静态资产。目录结构是这样的 java/ resources/ assets/ file1.txt file2.txt subdir/ file3.txt 我想将资产目录(递归)复制到文件系统上的某个位置。如果我使用IOUtils.copy(InputStream-in,OutputStream-out),那么我会得到一个空指针异常 InputStream in = g

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

java/
resources/
    assets/
        file1.txt
        file2.txt
        subdir/
            file3.txt
我想将资产目录(递归)复制到文件系统上的某个位置。如果我使用
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中的目录复制到文件系统中?

将您所有的资产文件放入一个zip文件中,正如ReddyMail链接到的问题中所提到的,这是一种非常好的方法

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

  • .jar或zip文件中的目录条目只是一个名称;没有办法“列出”它
  • .jar文件并不总是可以获得的,因为
  • 有些复杂的类加载器从目录或.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);
        }
    }
}

如果有人仍在寻找这个,我只共享了一个类,它正好做到了这一点:将资源目录复制到文件系统中的目标位置。可以在这里找到:

你看到这个帖子了吗?是的,谢谢,但是我想避免将资产压缩到自己的文件中。没有一种方法可以不这样做而重复复制目录吗?您的答案应该注意,当且仅当资源位于jar文件中时,它才会工作。类加载器可以从jar文件以外的其他东西加载资源。@toolforger感谢您的澄清。欢迎你的贡献。