压缩输出很容易。由于compress.deflate()
is aProcess1[ByteVector, ByteVector]
您需要将其插入您正在发出ByteVector
s 的管道中(即紧随其后text.utf8Encode
的是 a 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
用来读取压缩文件。您需要一个生成ByteVector
s 而不是String
s 的进程,以便将它们通过管道传输到inflate
. (您可以使用io.fileChunkR
它。)下一步是将未压缩的数据解码为String
s (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"))
.run