2016-09-26 83 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); 
     } 
    } 
} 
相關問題