Package gzip

import "compress/gzip"
Overview
Index
Examples

Overview ▾

Package gzip implements reading and writing of gzip format compressed files, as specified in RFC 1952.

示例(WriterReader)

Name: a-new-hope.txt
Comment: an epic space opera by George Lucas
ModTime: 1977-05-25 00:00:00 +0000 UTC

A long time ago in a galaxy far, far away...

Constants

这些常量是从Flate包中复制的,因此导入" compress / gzip"的代码也不必导入" compress / flate".

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

Variables

var (
    // ErrChecksum is returned when reading GZIP data that has an invalid checksum.
    ErrChecksum = errors.New("gzip: invalid checksum")
    // ErrHeader is returned when reading GZIP data that has an invalid header.
    ErrHeader = errors.New("gzip: invalid header")
)

gzip文件存储一个标头,该标头提供有关压缩文件的元数据. 该标头作为Writer和Reader结构的字段公开.

字符串必须是UTF-8编码的,并且由于GZIP文件格式的限制,只能包含Unicode代码点U + 0001至U + 00FF.

type Header struct {
    Comment string    // comment
    Extra   []byte    // "extra data"
    ModTime time.Time // modification time
    Name    string    // file name
    OS      byte      // operating system type
}

type Reader

Reader是io.Reader,可以读取该文件以从gzip格式的压缩文件中检索未压缩的数据.

通常,gzip文件可以是gzip文件的串联,每个文件都有自己的标头. 从Reader读取将返回每个未压缩数据的串联. 在阅读器字段中仅记录第一个标头.

Gzip文件存储未压缩数据的长度和校验和. 如果读取的数据没有预期的长度或校验和,则当读取到达未压缩数据的末尾时,读取器将返回ErrChecksum. 在收到io.EOF标记数据结束之前,客户应将Read返回的数据视为临时的.

type Reader struct {
    Header // valid after NewReader or Reader.Reset
    // contains filtered or unexported fields
}

func NewReader

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

NewReader创建一个读取给定阅读器的新阅读器. 如果r还没有实现io.ByteReader,则解压缩器可能会从r读取比所需更多的数据.

完成后,调用方有责任在Reader上调用Close.

Reader.Header字段在返回的Reader中有效.

func (*Reader) Close

func (z *Reader) Close() error

关闭关闭阅读器. 它不会关闭底层的io.Reader. 为了验证GZIP校验和,必须完全消耗读取器,直到io.EOF.

func (*Reader) Multistream 1.4

func (z *Reader) Multistream(ok bool)

多流控制阅读器是否支持多流文件.

如果启用(默认),则Reader希望输入是一系列单独压缩的数据流,每个数据流都有自己的标题和结尾,以EOF结尾. 效果是,压缩文件序列的串联被视为等同于该序列串联的gzip. 这是gzip阅读器的标准行为.

调用Multistream(false)会禁用此行为; 当读取区分单个gzip数据流或将gzip数据流与其他数据流区分开的文件格式时,禁用该行为可能很有用. 在这种模式下,当Reader到达数据流的末尾时,Read返回io.EOF. 基础阅读器必须实现io.ByteReader才能将其定位在gzip流之后. 要开始下一个流,请调用z.Reset(r),然后调用z.Multistream(false). 如果没有下一个流,则z.Reset(r)将返回io.EOF.

Example

Name: file-1.txt
Comment: file-header-1
ModTime: 2006-02-01 03:04:05 +0000 UTC

Hello Gophers - 1

Name: file-2.txt
Comment: file-header-2
ModTime: 2007-03-02 04:05:06 +0000 UTC

Hello Gophers - 2

func (*Reader) Read

func (z *Reader) Read(p []byte) (n int, err error)

Read实现io.Reader,从其基础Reader读取未压缩的字节.

func (*Reader) Reset 1.3

func (z *Reader) Reset(r io.Reader) error

重置将丢弃Reader z的状态,并使其等效于从NewReader读取其原始状态的结果,但改为从r读取. 这允许重用Reader,而不是分配新的Reader.

type Writer

Writer是io.WriteCloser. 对Writer的写入将被压缩并写入w.

type Writer struct {
    Header // written at first call to Write, Flush, or Close
    // contains filtered or unexported fields
}

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriter返回一个新的Writer. 对返回的写入器的写入将被压缩并写入w.

完成后,调用方有责任在Writer上调用Close. 写入可能会被缓冲,直到关闭才刷新.

希望在Writer.Header中设置字段的调用者必须在首次调用Write,Flush或Close之前进行设置.

func NewWriterLevel

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

NewWriterLevel类似于NewWriter,但是指定压缩级别,而不是假设DefaultCompression.

压缩级别可以是DefaultCompression,NoCompression,HuffmanOnly或BestSpeed和BestCompression之间的任何整数值. 如果级别有效,则返回的错误将为nil.

func (*Writer) Close

func (z *Writer) Close() error

Close通过将所有未写入的数据刷新到基础io.Writer并写入GZIP页脚来关闭Writer. 它不会关闭底层的io.Writer.

func (*Writer) Flush 1.1

func (z *Writer) Flush() error

刷新会将所有待处理的压缩数据刷新到基础写入器.

主要在压缩网络协议中有用,以确保远程读取器具有足够的数据来重构数据包. 在写入数据之前,刷新不会返回. 如果基础编写器返回错误,则Flush返回该错误.

在zlib库的术语中,Flush等效于Z_SYNC_FLUSH.

func (*Writer) Reset 1.2

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

重置将丢弃Writer z的状态,并使它等效于NewWriter或NewWriterLevel的原始状态的结果,但改为写入w. 这允许重用Writer而不是分配一个新的Writer.

func (*Writer) Write

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

Write将p的压缩形式写入基础io.Writer. 在关闭Writer之前,不必刷新压缩字节.

by  ICOPY.SITE