2

我是 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)
    }
}

但没有成功。我已经检查是否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。任何的想法?

[另一个编辑]

我已将新文件添加plik.txt到资源目录。运行应用程序后出现错误JAR entry resources/plik.txt not found in C:\Users\uer\.m2\repository\pl\gradle\is2k8\0.9\is2k8-0.9.jar。我不知道为什么我会收到这个错误。我检查了它plik.txt并存在于jar文件中。例如,我还输入了不存在的路径,getClass().getResources("/resources/thisdoesntexist.txt")我得到了这个错误Cannot invoke method withInputStream() on null object

4

1 回答 1

1

您应该始终使用getResourceAsStream来读取资源文件的内容,即使在 Groovy 中也是如此。如果资源路径(在 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
}
于 2013-05-22T19:06:52.843 回答