2016-09-26 81 views
0

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

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的一部分到文件系统?

+1

你见过这个线程 http://stackoverflow.com/questions/1386809/copy-directory-from-a-jar-file – Reddymails

+0

:然后复制它们在运行时是从该文件中读取容易是的,谢谢,但我有点想避免将资产归档到他们自己的文件中。没有这样做,没有办法复制目录recurisvely? – Kevin

回答

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); 
     } 
    } 
} 
相关问题