...

パッケージ zlib

import "compress/zlib"
概要
目次

概要 ▾

zlib パッケージは, RFC 1950 に記載されている zlib フォーマット圧縮データの読み書きを実装します。

この実装は,読み込みの際に解凍し,書き込みの際に圧縮するフィルターを備えています。 例えば,圧縮データをバッファに書き込むには次のようにします。

var b bytes.Buffer
w := zlib.NewWriter(&b)
w.Write([]byte("hello, world\n"))
w.Close()

このデータを読み込むには次のようにします。

r, err := zlib.NewReader(&b)
io.Copy(os.Stdout, r)
r.Close()

定数

これらの定数は flate パッケージからコピーされているので, "compress/zlib" をインポートするコードは "compress/flate" をインポートする必要はありません。

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

変数

var (
    // ErrChecksum は,無効なチェックサムを持つ ZLIB データを読み込むと返されます。
    ErrChecksum = errors.New("zlib: invalid checksum")
    // ErrDictionary は,無効な辞書を持つ ZLIB データを読み込むとが返されます。
    ErrDictionary = errors.New("zlib: invalid dictionary")
    // ErrHeader は,無効なヘッダを持つ ZLIB データを読み込むと返されます。
    ErrHeader = errors.New("zlib: invalid header")
)

func NewReader

func NewReader(r io.Reader) (io.ReadCloser, error)

NewReader は新しい ReadCloser を作成します。 返り値の ReadCloser からの読み取りは, r からデータを読み取り,解凍します。 r が io.ByteReader を実装していない場合,解凍器は r から必要以上のデータを読み取る可能性があります。 完了したら ReadCloser の Close を呼び出すのは呼び出し側の責任です。

NewReader から返される ReadCloser も Resetter を実装します。

コード:

buff := []byte{120, 156, 202, 72, 205, 201, 201, 215, 81, 40, 207,
    47, 202, 73, 225, 2, 4, 0, 0, 255, 255, 33, 231, 4, 147}
b := bytes.NewReader(buff)

r, err := zlib.NewReader(b)
if err != nil {
    panic(err)
}
io.Copy(os.Stdout, r)

出力:

hello, world

func NewReaderDict

func NewReaderDict(r io.Reader, dict []byte) (io.ReadCloser, error)

NewReaderDict は NewReader に似ていますが,プリセット辞書を使用します。 圧縮データが辞書を参照していない場合, NewReaderDict は辞書を無視します。 圧縮データが別の辞書を参照している場合, NewReaderDict は ErrDictionary を返します。

NewReaderDict から返される ReadCloser も Resetter を実装します。

type Resetter 1.4

Resetter は, NewReader または NewReaderDict によって返された ReadCloser をリセットして,新しい内部の Reader に切り替えます。 これにより,新しく割り当てる代わりに ReadCloser を再利用できます。

type Resetter interface {
    // Reset はバッファされたデータを破棄し,
    // あたかも引数のリーダーで新しく初期化されたかのように Resetter をリセットします。
    Reset(r io.Reader, dict []byte) error
}

type Writer

Writer は書き込まれたデータを受け取り,そのデータの圧縮形式を内部の Writer に書き込みます (NewWriter を参照) 。

type Writer struct {
    // エクスポートされていないフィールドがあります
}

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriter は新しい Writer を作成します。 返り値の Writer への書き込みは圧縮され, w に書き込まれます。

完了したら Writer の Close を呼び出すのは呼び出し側の責任です。 書き込みはバッファリングされ,閉じるまでフラッシュされないことがあります。

コード:

var b bytes.Buffer

w := zlib.NewWriter(&b)
w.Write([]byte("hello, world\n"))
w.Close()
fmt.Println(b.Bytes())

出力:

[120 156 202 72 205 201 201 215 81 40 207 47 202 73 225 2 4 0 0 255 255 33 231 4 147]

func NewWriterLevel

func NewWriterLevel(w io.Writer, level int) (*Writer, error)

NewWriterLevel は NewWriter に似ていますが, DefaultCompression とせずに,圧縮レベルを指定します。

圧縮レベルは, DefaultCompression, NoCompression, HuffmanOnly, または BestSpeed と BestCompression の間の整数値です。 レベルが有効な場合,返されるエラーは nil になります。

func NewWriterLevelDict

func NewWriterLevelDict(w io.Writer, level int, dict []byte) (*Writer, error)

NewWriterLevelDict は NewWriterLevel に似ていますが, 圧縮に使用する辞書を指定します。

辞書は nil かもしれません。 そうでなければ,その内容は Writer が閉じられるまで修正してはなりません。

func (*Writer) Close

func (z *Writer) Close() error

Close は Writer を閉じて,書き込まれていないデータを内部の io.Writer にフラッシュしますが,内部の io.Writer は閉じません。

func (*Writer) Flush

func (z *Writer) Flush() error

Flush は, Writer をその内部の io.Writer にフラッシュします。

func (*Writer) Reset 1.2

func (z *Writer) Reset(w io.Writer)

Reset は, NewWriterLevel または NewWriterLevelDict からの初期状態と同じになるように Writer z の状態を消去しますが,代わりに w に書き込みます。

func (*Writer) Write

func (z *Writer) Write(p []byte) (n int, err error)

Write は,内部の io.Writer に圧縮形式の p を書き込みます。 Writer が閉じられるか明示的にフラッシュされるまで,圧縮されたバイトは必ずしもフラッシュされません。