Curlで圧縮及び解凍する方法を記載します。Curlでは圧縮フォーマットにgzipとzlibをサポートしております。これを利用するには、CURL.IO.ZSTREAMパッケージをインポートします。
{import * from CURL.IO.ZSTREAM} |
この中のDeflateByteOutputStreamにて圧縮ストリームを生成し、InflateByteInputStreamにて解凍ストリームを生成することができます。以下に圧縮ファイルへの書き出しのサンプルコードを記載します。
{define-proc {compress in-url:Url, out-url:Url, compression-format:CompressionFormat = CompressionFormat.gzip || or zlib }:void {with-open-streams bos = {DeflateByteOutputStream {write-open-byte out-url}, compression-format = compression-format} do {with-open-streams bis = {read-open-byte in-url} do {while true do let (data:{Array-of byte}, num-read:int) = {bis.read n = 1024} {if num-read <= 0 then {break} } let start:int = 0 {while num-read > 0 do let written:int = {bos.write data, start = start, n = num-read } {if written <= 0 then {break} } {inc start, written} {dec num-read, written} } } } } } |
上記のサンプルプロシージャを用いて、以下のようにテキストファイルを圧縮し、圧縮ファイルに書き出すことができます。
{compress {url “a.txt”}, {url “a.gz”}} |
また、上記で圧縮したファイルを以下のサンプルプロシージャで解凍します。
{define-proc {uncompress {with-open-streams |
以下のようにサンプルプロシージャを実行し、解凍ファイルを取得します。
{uncompress {url “a.gz”}, {url “ab.txt”}} |
これらにより、HTTP圧縮・解凍の仕組みを実装することも可能です。
サンプルコード