scala - 如何将Scala流的内容写入文件?

标签 scala io

我有一个Scala字节流,我想将其写入文件。流中的数据太多,无法缓冲所有内存。

第一次尝试,我创建了一个类似于以下内容的InputStream:

class MyInputStream(data: Stream[Byte]) extends InputStream {
  private val iterator = data.iterator
  override def read(): Int = if (iterator.hasNext) iterator.next else -1
}

然后,我使用Apache Commons编写文件:
val source = new MyInputStream(dataStream)
val target = new FileOutputStream(file)
try {
  IOUtils.copy(source, target)
} finally {
  target.close
}

这行得通,但我对性能不太满意。我猜每个字节调用MyInputStream.read会带来很多开销。有没有更好的办法?

最佳答案

您可能会(或可能不会!)误认为读取侧是性能问题的根源。可能是事实,您正在使用无缓冲的FileOutputStream(...),对每个写入的字节强制进行单独的系统调用。

这是我的看法,快速而简单:

def writeBytes( data : Stream[Byte], file : File ) = {
  val target = new BufferedOutputStream( new FileOutputStream(file) );
  try data.foreach( target.write(_) ) finally target.close;
}

关于scala - 如何将Scala流的内容写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29978264/

相关文章:

c++ - 参数包展开顺序

scala - Scala 单例在类型层次结构中的位置

linux - 将 scala 中单元函数/方法的输出重定向为 linux 邮件命令的标准

linux - SSD的“典型”延迟意味着什么?

c - 我的服务器程序只在第二个请求到达时才回答第一个请求?

C# - 使用单个键从文本文件中获取多个值

python类文件缓冲区对象

scala - Spark流+卡夫卡: how to check name of topic from kafka message

scala - 类型不匹配;找到 : edu. stanford.nlp.util.CoreMap => 需要单位 : java. util.function.Consumer[_> : edu. stanford.nlp.util.CoreMap]

scala - Spark : grouping rows in array by key