0

我正在尝试流式传输 zip 文件。

以下代码块按预期逐行打印:

val inputStream = new GZIPInputStream(new FileInputStream("/some/path"))
val source = Source.fromInputStream(inputStream)
for(line <- source.getLines) {
  println(line)
}

但是这个没有任何作用(它甚至没有退出):

val inputStream = new ZipInputStream(new FileInputStream("/some/path"))
val source = Source.fromInputStream(inputStream)
for(line <- source.getLines) {
  println(line)
}

唯一的区别是使用 ofGZIPInputStream而不是ZipInputStream。两个类都实现了InputStream

我错过了什么吗?或者有什么解决办法吗?

4

1 回答 1

4

Gzip 只是一个压缩文件,可以在您从Source. Zip 并不是真正的流,它只是许多 java 用词不当之一(看看interface),它更像是一个目录,包含多个文件,您可以通过 遍历ZipEntry,并通过Source. 顶层没有真正的内容,只是一个目录列表,所以没有“行”可以通过Source.

简而言之,您只需遍历条目,为每个条目创建一个新的 Source。像这样的东西:

   Iterator
     .continually(zip.getNextEntry)
     .takeWhile(_ != null)
     .map { e => 
        e.getName -> Source.fromInputStream(zip).getLines.toList
     } 

(这会Map在 zip 中创建每个文件的名称到其整个内容 n 内存中,可能根本不是您想要的,只是说明您可以通过哪些方式访问该内容Source

于 2021-05-03T16:48:49.317 回答