为什么Source.from InputStream使用GZIPInputStream而不使用ZipInputStream [英] Why Source.fromInputStream is working with GZIPInputStream but not with ZipInputStream

查看:14
本文介绍了为什么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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆