scala - 将多个 FileInputStream 合并为单个 FileInputStream
问题描述
我有需要将多个 InputStream 合并为单个流的情况。我尝试了下面的代码,但它只返回最后一个文件/流的内容。代码有什么问题?有没有更好的方法来合并多个流?
def mergeInputStreams(l: List[File], accum: SequenceInputStream): SequenceInputStream = l match {
case Nil => accum
case x :: xs =>
val is = new FileInputStream(x.pathAsString)
mergeInputStreams(xs, new SequenceInputStream(is, accum))
}
解决方案
你在正确的轨道上,但我会使用SequenceInputStream
' 构造函数,它需要一个Enumeration
of File
s,并将我的输入文件列表映射到正确的类型来提供它:
import java.io.{File, FileInputStream, InputStream, SequenceInputStream}
import scala.collection.JavaConverters.asJavaEnumeration
def mergeInputStreams(files: Iterator[File]): InputStream =
new SequenceInputStream(asJavaEnumeration(files.map(new FileInputStream(_))))
另一个技巧是使用 Scala 包含的转换方法将 Scala 转换Iterator
为 Java Enumeration
。转换保留了顺序以及它是对文件序列的遍历这一事实,因此它还保留了输入流连接。
推荐阅读
- php - 在 PHP 中将 html 转换为 json
- mysql - 在线部署 RShiny 应用程序,并访问数据库
- java - 无法使用 itext 将法语字符从 DB(VARCHAR2 列)插入 PdfPCell
- javascript - 意外的关键字导出
- python - 如何在正则表达式中使用使用多个 unicode 点的字母?
- sql - 查询以获取推文列表,其中包含作家撰写的每条推文的最新 10 条评论,例如“巴拉克奥巴马”
- c# - Add a new value to a JSON
- kotlin - Is `Nothing?` a legitimate use for expressing that type of input parameter doesn't matter for subclass?
- html - Css indent parent/child
- c++ - How to display rate within a given date range(in the question below) using map in cpp?