调用 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 实例。