为什么Source.from InputStream使用GZIPInputStream而不使用ZipInputStream [英] Why Source.fromInputStream is working with GZIPInputStream but not with ZipInputStream
本文介绍了为什么Source.from InputStream使用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
获取的行。
Iterator
.continually(zip.getNextEntry)
.takeWhile(_ != null)
.map { e =>
e.getName -> Source.fromInputStream(zip).getLines.toList
}
(这将创建Zip中每个文件名称到其全部内容的内存中,可能根本不是您想要的,只是说明您可以通过访问内容))
这篇关于为什么Source.from InputStream使用GZIPInputStream而不使用ZipInputStream的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文