圧縮・解凍

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
                 in-url:Url,
                 out-url:Url,
                 compression-format:CompressionFormat =
                     CompressionFormat.gzip || or zlib
             }:void

    {with-open-streams
        bis = {InflateByteInputStream
                  {read-open-byte in-url},
                  compression-format = compression-format
              }
     do
        {with-open-streams
            bos = {write-open-byte out-url}
         do
            {while true do
                let (data:{Array-of byte}, num-read:int) = {bis.read n = 1024}
                {if num-read <= 0 then
                    {break}
                }
                {if-non-null data then
                    {bos.write {non-null data}, n = num-read}
                }
            }
        }
    }
}

以下のようにサンプルプロシージャを実行し、解凍ファイルを取得します。 

{uncompress {url “a.gz”}, {url “ab.txt”}}

これらにより、HTTP圧縮・解凍の仕組みを実装することも可能です。

サンプルコード

圧縮・解凍サンプルコード