调用 java.util.zip.ZipFile.getInputStream() 时出现 GroovyCastException
GroovyCastException when calling java.util.zip.ZipFile.getInputStream()
我正在尝试从 jar 存档中读取一个文件,return 它作为 java.io.InputStream。
这是我尝试实现的方法:
InputStream getExportInfo(path) {
def zipFile = new java.util.zip.ZipFile(new File(path))
zipFile.entries().each { entry ->
def name = entry.name
if (!entry.directory && name == "ExportInfo") {
java.io.InputStream is = zipFile.getInputStream(entry)
return is
}
}
}
但是我从控制台收到这个错误:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'java.util.zip.ZipFile$ZipEntryIterator@49defb82' with class 'java.util.zip.ZipFile$ZipEntryIterator' to class 'java.io.InputStream'
看起来 .getInputStream(entry) 没有 return 和 'java.io.InputStream',但它应该根据 documentation
这个 'cast' 是从哪里来的?
您正在从闭包中 returning,这会在您调用该方法时引发转换异常。
简单的解决方法是将 groovy 迭代更改为普通 for
循环:
InputStream getExportInfo(path) {
def zipFile = new java.util.zip.ZipFile(new File(path))
for( ZipEntry entry in zipFile.entries() ){
def name = entry.name
if (!entry.directory && name == "ExportInfo") {
return zipFile.getInputStream(entry)
}
}
}
然后它会中断循环并 return 您的 inputStream 实例。
我正在尝试从 jar 存档中读取一个文件,return 它作为 java.io.InputStream。
这是我尝试实现的方法:
InputStream getExportInfo(path) {
def zipFile = new java.util.zip.ZipFile(new File(path))
zipFile.entries().each { entry ->
def name = entry.name
if (!entry.directory && name == "ExportInfo") {
java.io.InputStream is = zipFile.getInputStream(entry)
return is
}
}
}
但是我从控制台收到这个错误:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'java.util.zip.ZipFile$ZipEntryIterator@49defb82' with class 'java.util.zip.ZipFile$ZipEntryIterator' to class 'java.io.InputStream'
看起来 .getInputStream(entry) 没有 return 和 'java.io.InputStream',但它应该根据 documentation
这个 'cast' 是从哪里来的?
您正在从闭包中 returning,这会在您调用该方法时引发转换异常。
简单的解决方法是将 groovy 迭代更改为普通 for
循环:
InputStream getExportInfo(path) {
def zipFile = new java.util.zip.ZipFile(new File(path))
for( ZipEntry entry in zipFile.entries() ){
def name = entry.name
if (!entry.directory && name == "ExportInfo") {
return zipFile.getInputStream(entry)
}
}
}
然后它会中断循环并 return 您的 inputStream 实例。