[英]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.