在下面的scalaz-stream使用示例(取自文档)中,如果输入和/或输出是一个压缩文件,我需要更改什么?换句话说,我如何使用compress?
import scalaz.stream._
import scalaz.concurrent.Task
val converter: Task[Unit] =
io.linesR("testdata/fahrenheit.txt")
.filter(s => !s.trim.isEmpty && !s.startsWith("//"))
.map(line => fahrenheitToCelsius(line.toDouble).toString)
.intersperse("\n")
.pipe(text.utf8Encode)
.to(io.fileChunkW("testdata/celsius.txt"))
.run
// at the end of the universe...
val u: Unit = converter.run发布于 2015-05-04 19:59:09
压缩输出是容易的。由于compress.deflate()是Process1[ByteVector, ByteVector],所以需要将其插入管道中,在管道中发射ByteVectors (在text.utf8Encode之后,即Process1[String, ByteVector]):
val converter: Task[Unit] =
io.linesR("testdata/fahrenheit.txt")
.filter(s => !s.trim.isEmpty && !s.startsWith("//"))
.map(line => fahrenheitToCelsius(line.toDouble).toString)
.intersperse("\n")
.pipe(text.utf8Encode)
.pipe(compress.deflate())
.to(io.fileChunkW("testdata/celsius.zip"))
.run对于inflate,不能使用io.linesR读取压缩文件。您需要一个生成ByteVectors而不是Strings的进程,以便将它们输送到inflate中。(您可以使用io.fileChunkR实现这个功能。)下一步是将未压缩的数据解码为String(例如,使用text.utf8Decode ),然后使用text.lines()逐行发出文本。像这样的事情应该能起作用:
val converter: Task[Unit] =
Process.constant(4096).toSource
.through(io.fileChunkR("testdata/fahrenheit.zip"))
.pipe(compress.inflate())
.pipe(text.utf8Decode)
.pipe(text.lines())
.filter(s => !s.trim.isEmpty && !s.startsWith("//"))
.map(line => fahrenheitToCelsius(line.toDouble).toString)
.intersperse("\n")
.pipe(text.utf8Encode)
.to(io.fileChunkW("testdata/celsius.txt"))
.runhttps://stackoverflow.com/questions/30031377
复制相似问题