为什么`readLines`关闭一个ZipInputStream?

时间:2015-04-15 03:41:08

标签: groovy

在Groovy(v2.4.1)中,我正在尝试读取压缩文件中文件的内容,

import java.util.zip.*

ZipInputStream zis = new ZipInputStream(new FileInputStream("d:\\temp\\small.zip"))

while (zipEntry = zis.nextEntry) {
    println "Reading ${zipEntry.name}..."
    def filedata = zis.readLines()
    println filedata
}
读取zip中的第一个文件

后,

出现以下错误

java.io.IOException: Stream closed

为什么会这样?它与eachLinegetText相同(未尝试InputStream中的任何其他方法)如何从ZipInputStream groovy中读取所有zip文件内容1}}?

更新 虽然我上面使用了一个文件作为示例,但实际上我只有InputStream而不是物理文件

1 个答案:

答案 0 :(得分:4)

InputStream readLines()方法是通过this课程添加的。当您查看第791行时,您将看到readLines()被委派给以Reader为参数的重写版本。正如在docs中可以看到的,此方法在读取后关闭流。这就是你的例子失败的原因。

以下是如何做到的:

import java.util.zip.*

def zis = new ZipInputStream(new FileInputStream('lol.zip'))

while (zipEntry = zis.nextEntry) {
    println "Reading $zipEntry.name"
    def output = new ByteArrayOutputStream()
    output << zis
    println "Output: $output"
}