我遇到需要将多个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))
}
答案 0 :(得分:2)
您在正确的轨道上,但是我会使用SequenceInputStream
的构造函数,该构造函数包含Enumeration
中的File
,并且只将我的输入文件列表映射为正确的类型来补充:
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
。转换保留顺序,并且保留了对文件序列的遍历,因此还保留了输入流的串联。