1

私は scalaz stream website からこのコードを使用します。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 に答える