метод добавления из scalaz stream io вызывает бесконечный цикл

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

Я в замешательстве, может кто-нибудь объяснить мне, что здесь происходит

Спасибо заранее


person Xiaohe Dong    schedule 23.10.2014    source источник
comment
дружеское предложение - попробуйте прочитать документацию по API онлайн здесь, прежде чем задавать вопросы. В документах сказано, что append — это общая функция, запускающая один процесс за другим, она не имеет ничего общего с файлами. Похоже, вы могли предположить, что append сделал что-то совсем другое, потому что имя совпало с тем, что вы пытались сделать. :) Конечно, если документы неясны, то обязательно спрашивайте!   -  person pchiusano    schedule 24.10.2014


Ответы (1)


«Добавить» - это не добавление в файл, это комбинатор для добавления одного процесса к другому. Я не могу сказать, что вы действительно получаете с 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
    })
person Eugene Zhulenev    schedule 23.10.2014
comment
Думаю, было бы неплохо, если бы что-то подобное было в scalaz-stream. - person Frank S. Thomas; 24.10.2014