import "compress/gzip"

RFC 1952で定義されているgzip形式圧縮ファイルの読み書きを実装しています。

パッケージファイル

gunzip.go gzip.go

定数

これら定数はflateパッケージからコピーされているため、 “compress/gzip”をインポートしているコードでは”compress/flate”をインポートする必要はありません。

const (
    NoCompression      = flate.NoCompression
    BestSpeed          = flate.BestSpeed
    BestCompression    = flate.BestCompression
    DefaultCompression = flate.DefaultCompression
)

変数

var ChecksumError os.Error = os.ErrorString("gzip checksum error")
var HeaderError os.Error = os.ErrorString("invalid gzip header")

Compressor型

Compressorは、 ラップしているio.Writerに圧縮データを書き込むio.WriteCloserです。

type Compressor struct {
    Header
    // contains unexported fields
}

NewWriter関数

func NewWriter(w io.Writer) (*Compressor, os.Error)

NewWriterは、デフォルトの圧縮レベルでNewWriterLevelを呼び出します。

NewWriterLevel関数

func NewWriterLevel(w io.Writer, level int) (*Compressor, os.Error)

NewWriterLevelは、与えられたwriterに書き込みを行う新しいCompressorを作成します。書き込みはバッファリングされ Closeされるまでフラッシュされません。呼び出し側で、Compressor.Headerのフィールドに値を設定するときは、最初にWriteか Closeを呼び出す前に行う必要があります。使い終わったときは呼び出し側の責任でWriteCloserのCloseを呼び出してください。 levelは圧縮レベルで、DefaultCompression(デフォルト圧縮)、NoCompression(圧縮無し)、または BestSpeed(速度最優先)からBestCompression(圧縮率最優先)の整数値を指定することが可能です。

(*Compressor) Close関数

func (z *Compressor) Close() os.Error

Closeの呼び出しでは、NewWriterにパラメータとして与えたio.Writerはクローズしません。

(*Compressor) Write関数

func (z *Compressor) Write(p []byte) (int, os.Error)

Decompressor型

Decompressorはgzip形式圧縮ファイルからデータを読み込み解凍するio.Readerです。

通常、gzipファイルは複数のgzipファイ ルを結合したもので、それぞれがヘッダを持っています。Decompressorの読み込みでは、各非圧縮データを連結したものが返されますが、Decompressorのフィールドに書き込まれるのは先頭のヘッダだけです。

gzipファイルは圧縮されていないデータの長さとチェックサムを格納します。 Decompressorは圧縮されていないデータの読み込みが終わりに達した際に期待される長さまたはチェックサムを持たない場合はChecksumError を返します。クライアントではReadで正常に全てのデータを読み込んだ(長さが0で、エラーはnil)ことを確認してからデータを扱わなければいけませ ん。

type Decompressor struct {
    Header
    // contains unexported fields
}

NewReader関数

func NewReader(r io.Reader) (*Decompressor, os.Error)

NewReaderは、与えられたリーダから読み込む新しいDecompressorを作成します。実装しているバッファはrから必要以上のデータを読み込む可能性があります。使い終わったときは呼び出し側の責任でDecompressorのCloseを呼び出してください。

(*Decompressor) Close関数

func (z *Decompressor) Close() os.Error

Closeの呼び出しでは、NewReaderにパラメータとして与えたio.Readerはクローズしません。

(*Decompressor) Read関数

func (z *Decompressor) Read(p []byte) (n int, err os.Error)

gzipファイルには圧縮ファイルに関するメタデータを持つヘッダが格納されています。このヘッダはCompressor構造体とDecompressor構造体に埋め込まれます。

type Header struct {
    Comment string // コメント
    Extra   []byte // "extra data"
    Mtime   uint32 // 変更時刻 (1970/1/1からの秒数)
    Name    string // ファイル名
    OS      byte   // オペレーティングシステムの種類
}

バグ

CommentとNameは、ISO 8859-1 (Latin-1)0×00-0x7f 以外のUTF-8文字コードを正しくマップしません。