1

我使用来自 scalaz 流网站的这段代码,它正在使用 to 方法,但是当我尝试使用 append 时它失败了,它看起来像一个无限循环并且永远不会完成。我想使用 append 方法的原因是我不想使用 to 方法重写文件。

io.linesR(t)
  .intersperse("\n")
  .pipe(text.utf8Encode)
  .to(io.fileChunkW(target))
  .run.run //success

files.foreach(t => {
      io.linesR(t)
        .intersperse("\n")
        .pipe(text.utf8Encode)
        .append(io.fileChunkW(target))
        .run.run
    }) //the program keeps running, it looks like in an infinite loop

我对此感到困惑,有人可以向我解释这里发生了什么

提前谢谢了

4

1 回答 1

2

'append' 不是关于追加到文件,它是将一个进程附加到另一个进程的组合器。我不能说在你的情况下你真正得到了什么,有点奇怪,我认为你得到了无限的函数流 ByteVector => Task[Unit],这就是它永远不会完成的原因。

您需要自定义 fileChunkW 方法,例如您可以这样做:

def appendFileChunkW(f: String, bufferSize: Int = 4096, append: Boolean = true): Sink[Task,ByteVector] =
    io.chunkW(new BufferedOutputStream(new FileOutputStream(f, append), bufferSize))

files.foreach(t => {
      io.linesR(t)
        .intersperse("\n")
        .pipe(text.utf8Encode)
        .to(appendFileChunkW(target))
        .run.run
    })
于 2014-10-23T04:03:24.357 回答