如何解决为什么 Source.fromInputStream 使用 GZIPInputStream 而不是 ZipInputStream
我正在尝试流式传输 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
。两个类都实现了 InputStream
。
我错过了什么吗?或者有什么解决办法?
解决方法
Gzip 只是一个压缩文件,可以在您从 Source
读取时即时解压缩。
Zip 并不是真正的流,它只是众多 Java 误称之一(看看 interface),它更像是一个目录,包含多个文件,您可以通过 ZipEntry
遍历,并且通过 Source
分别阅读每一个。顶层没有真正的内容,只有一个目录列表,所以没有“行”可以通过 Source
获取。
简而言之,您只需遍历条目,为每个条目创建一个新的 Source。像这样:
Iterator
.continually(zip.getNextEntry)
.takeWhile(_ != null)
.map { e =>
e.getName -> Source.fromInputStream(zip).getLines.toList
}
(这会在 zip 中创建每个文件名称的 Map
到其整个内容 n 内存,可能根本不是您想要的,只是说明您可以通过 {{ 1}})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。