我正在尝试创建和下载存档文件而不依赖于内存(以避免大文件出现内存不足异常),为此,我找到了一个示例:https://gist.github.com/kirked/412b5156f94419e71ce4a84ec1d54761,但是此示例使用一个将来的选项Input Stream作为要存档的数据源,我首先尝试通过将Future(None)
传递到ZipEnumerator对象的apply方法来创建和下载空的zip文件,如下所示:
val sources =fileNames.map(file=>
ZipEnumerator.Source(file, { () => Future(None)}))
因此,我可以下载并打开空的存档文件。但是,当我创建一个将Enumerator[Elem]
转换为方法时(由于我要存档的数据来自elem的枚举器,而不是inputStream),因此我下载了文件并尝试打开它,但出现以下异常:加载归档文件时发生错误。
所以这是负责转换的方法:
Future[Option[InputStream]]
这是电话:
def enumeratorToInputStream(enumerator: Enumerator[Elem]): Future[Option[InputStream]] = {
val pos = new PipedOutputStream()
val pis = new PipedInputStream(pos)
val it = Iteratee.foreach[Array[Byte]](pos.write)
Await.result(enumerator.map(node=> node.mkString("char UTF-8").getBytes("UTF-8")).onDoneEnumerating(pos.close()) |>>> it, Duration.Inf)
Future(Some(pis))}