如果您打算与conduits 合作,我强烈建议您先阅读关于此主题的优秀Conduit overview by Michael Snoyman 和FP Complete tutorial。
我已经打开了我的-vv 标志以使其适合 Haskell 初学者(比如我自己)。
你需要三样东西:
- 文件源
- 一个 zlib 解压过滤器
- 标准输出接收器
让我们从这个简单的文件复制示例开始:
import Data.Conduit (runResourceT, ($$))
import qualified Data.Conduit.Binary as CB
import Data.Conduit.Zlib
main = do
runResourceT $ CB.sourceFile "input.txt" $$ CB.sinkFile "output.txt"
这里需要修改什么?
- 输入文件名不是
a.txt.gz
- zlib 解压器丢失
- 我们想输出到标准输出,而不是
output.txt
decompress documentation 确实包含如何解压缩的示例。
请注意,您不能将decompress 用于gzip 生成的文件。 decompress 解压缩由旧的compress UNIX 程序生成的.Z 文件。
修改上面的例子我们得到:
import Data.Conduit (runResourceT, ($$), ($=))
import qualified Data.Conduit.Binary as CB
import Data.Conduit.Zlib
import System.IO
main = do
runResourceT $ CB.sourceFile "a.txt.gz" $= ungzip $$ CB.sinkHandle stdout
使用bzlib-conduit 时的差别很小:
import Data.Conduit (runResourceT, ($$), ($=))
import qualified Data.Conduit.Binary as CB
import Data.Conduit.BZlib
import System.IO
main = do
runResourceT $ CB.sourceFile "a.txt.bz2" $= bunzip2 $$ CB.sinkHandle stdout