将多个FileInputStream合并为单个FileInputStream

时间:2018-12-22 06:15:14

标签: scala merge 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))
  }

1 个答案:

答案 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。转换保留顺序,并且保留了对文件序列的遍历,因此还保留了输入流的串联。