在Groovy中,我正在从JAR内部读取一个文件,经过一些处理后,我希望删除这个JAR,但是一旦通过URL访问,它似乎不会让我。
示例:
File jarFile = new File('jarFile.jar')
URL url = jarFile.toURI().toURL()
URL intUrl = new URL("jar:$url!/internalFile.json")
println intUrl.text // reads text correctly
jarFile.delete() // returns false, cannot delete
getText()命令的Javadoc表示连接在调用结束时关闭,并且此JAR通常不在类路径上。有没有办法让这段代码有效?
答案 0 :(得分:2)
尝试设置sun.zip.disableMemoryMapping
系统属性:
java -Dsun.zip.disableMemoryMapping=true ....
(或者在调用Gradle时设置系统属性)。 ZipFile
(支持jar:
个网址)默认使用内存映射,这可能会导致Windows认为相关文件仍处于打开状态。如果这不是一个选项,那么您可以尝试使用commons-compress
ZipFile实现而不是java.util.zip
实现:
@Grab(group='org.apache.commons', module='commons-compress', version='1.4.1')
import org.apache.commons.compress.archivers.zip.*
File jarFile = new File('jarFile.jar')
ZipFile f = new ZipFile(jarFile)
ZipArchiveEntry json = f.getEntry('internalFile.json')
if(json) {
f.getInputStream(json)?.withStream {
println it.getText('UTF-8')
}
}
f.close()
jarFile.delete()
答案 1 :(得分:0)
你可以试试这个:
import java.util.zip.ZipFile
File jarFile = new File( 'jarFile.jar' )
String text = new ZipFile( jarFile ).with { zf ->
String result = zf.entries().findResult { ze ->
if( ze.name == 'internalFile.json' ) {
zf.getInputStream( ze ).withReader {
it.text
}
}
}
zf.close()
result
}
println text
jarFile.delete()
要避免(我怀疑的是)类加载器锁定jar文件