2013-05-22 32 views
0

我在groovy中是全新的,我想從jar文件中解壓縮資源。我嘗試了用這種方式爲tim_yates寫到這裏https://stackoverflow.com/a/16645378/2069368無效的文字/長度代碼 - 如何解決這個問題?

getClass().getResource('/resources/my.dll').withInputStream { 
    is -> new File("my.dll").withOutputStream { 
     os -> os << is 
    } 
} 

,但我得到的錯誤:

Caused by: java.util.zip.ZipException: invalid literal/length code 
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) 
    at java.io.FilterInputStream.read(FilterInputStream.java:133) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) 
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334) 
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.leftShift(DefaultGroovyMethods.java:9643) 
    at org.codehaus.groovy.runtime.dgm$458.invoke(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271) 
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 

我也試過這樣:

getClass().getResource('/resources/my.dll').withInputStream { 
    is -> new File("my.dll").withOutputStream { 
     os -> Files.copy(is, os) 
    } 
} 

但沒有成功。我checket如果is可用,它是(is.available()回報914432)

[編輯]

如果我會嘗試複製文件,這樣它的工作原理:

new File("C:\\Document.html").withInputStream { 
    is -> new File("C:\\Document_Copy.html").withOutputStream { 
     os -> os << is 
    } 
} 

我確定my.dll在jar文件中 - 我從本地maven存儲庫加載jar。任何想法?

[ANOTHER編輯]

我已經添加了新的文件plik.txt資源目錄。運行應用程序後,我收到錯誤JAR entry resources/plik.txt not found in C:\Users\uer\.m2\repository\pl\gradle\is2k8\0.9\is2k8-0.9.jar。我不知道爲什麼我得到這個錯誤。我檢查了它,並在jar文件中存在plik.txt。我也輸入了不存在的路徑,例如getClass().getResources("/resources/thisdoesntexist.txt"),我得到這個錯誤Cannot invoke method withInputStream() on null object

回答

0

即使在Groovy中,您也應始終使用getResourceAsStream來讀取資源文件的內容。如果資源路徑(Jar內部)是resources/my.dll,並且Jar位於類路徑上,則應該可以工作:

def stream = getClass().classLoader.getResourceAsStream("resources/my.dll") 
def file = new File("my.dll") 
file.delete() 
stream.withStream { 
    file << stream 
} 
+0

謝謝!有用! – pepuch