繁体   English   中英

为什么 Source.fromInputStream 使用 GZIPInputStream 而不是 ZipInputStream

[英]Why Source.fromInputStream is working with GZIPInputStream but not with ZipInputStream

我正在尝试 stream 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)
}

唯一的区别是使用GZIPInputStream而不是ZipInputStream class 都实现了InputStream

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

Gzip 只是一个压缩文件,可以在您从Source读取时即时解压缩。 Zip isn't really a stream, it's just one of many java misnomers (take a look at the interface ), it's more like a directory, containing several files, that you can traverse via ZipEntry , and read each one separately via Source . 顶层没有真正的内容,只是一个目录列表,所以没有“行”可以通过Source获取。

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

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

(这将创建Map中每个文件的名称 zip 到其全部内容 n memory,可能,根本不是您想要的,只是通过Source说明您可以做什么来访问该内容)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM