Объединить несколько FileInputStreams в один FileInputStream - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть ситуация, когда мне нужно объединить несколько 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 голосов
/ 22 декабря 2018

Вы на правильном пути, но я бы использовал конструктор 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.Преобразование сохраняет порядок и тот факт, что это обход последовательности файлов, поэтому оно также сохраняет конкатенацию входного потока.

...