首页 > 解决方案 > 将多个 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))
  }

标签: scalamergefileinputstream

解决方案


你在正确的轨道上,但我会使用SequenceInputStream' 构造函数,它需要一个Enumerationof Files,并将我的输入文件列表映射到正确的类型来提供它:

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。转换保留了顺序以及它是对文件序列的遍历这一事实,因此它还保留了输入流连接。


推荐阅读