GO语言"compress/gzip"包中"Reader.Multistream"类型的用法及代码示例。
用法:
func(z *Reader) Multistream(ok bool)
Multistream 控制阅读器是否支持多流文件。
如果启用(默认),Reader 期望输入是一系列单独压缩的数据流,每个数据流都有自己的标头和尾标,以 EOF 结尾。效果是 gzip 压缩文件序列的串联被视为等同于序列串联的 gzip。这是 gzip 阅读器的标准行为。
调用 Multistream(false) 禁用此行为;在读取区分单个 gzip 数据流或将 gzip 数据流与其他数据流混合的文件格式时,禁用该行为可能很有用。在这种模式下,当 Reader 到达数据流的末尾时,Read 返回 io.EOF。底层阅读器必须实现 io ByteReader 才能保持在 gzip 流之后的位置。要开始下一个流,请调用 z.Reset(r),然后调用 z.Multistream(false)。如果没有下一个流,z.Reset(r) 将返回 io.EOF。
例子:
package main
import (
"bytes"
"compress/gzip"
"fmt"
"io"
"log"
"os"
"time"
)
func main() {
var buf bytes.Buffer
zw := gzip.NewWriter(&buf)
var files = []struct {
name string
comment string
modTime time.Time
data string
}{
{"file-1.txt", "file-header-1", time.Date(2006, time.February, 1, 3, 4, 5, 0, time.UTC), "Hello Gophers - 1"},
{"file-2.txt", "file-header-2", time.Date(2007, time.March, 2, 4, 5, 6, 1, time.UTC), "Hello Gophers - 2"},
}
for _, file := range files {
zw.Name = file.name
zw.Comment = file.comment
zw.ModTime = file.modTime
if _, err := zw.Write([]byte(file.data)); err != nil {
log.Fatal(err)
}
if err := zw.Close(); err != nil {
log.Fatal(err)
}
zw.Reset(&buf)
}
zr, err := gzip.NewReader(&buf)
if err != nil {
log.Fatal(err)
}
for {
zr.Multistream(false)
fmt.Printf("Name: %s\nComment: %s\nModTime: %s\n\n", zr.Name, zr.Comment, zr.ModTime.UTC())
if _, err := io.Copy(os.Stdout, zr); err != nil {
log.Fatal(err)
}
fmt.Print("\n\n")
err = zr.Reset(&buf)
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
}
if err := zr.Close(); err != nil {
log.Fatal(err)
}
}
输出:
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
相关用法
- GO Reader.Len用法及代码示例
- GO Reader.ReadAll用法及代码示例
- GO Reader用法及代码示例
- GO ReadMessage用法及代码示例
- GO Read用法及代码示例
- GO ReadFile用法及代码示例
- GO ReadAtLeast用法及代码示例
- GO ReadDir用法及代码示例
- GO ReadFull用法及代码示例
- GO ReadAll用法及代码示例
- GO Regexp.FindString用法及代码示例
- GO Regexp.FindAllIndex用法及代码示例
- GO ResponseRecorder用法及代码示例
- GO ReverseBytes64用法及代码示例
- GO ReverseBytes16用法及代码示例
- GO Regexp.ReplaceAllLiteralString用法及代码示例
- GO Regexp.FindStringSubmatch用法及代码示例
- GO Regexp.FindAllString用法及代码示例
- GO Regexp.ExpandString用法及代码示例
- GO ResponseWriter用法及代码示例
注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 Reader.Multistream。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。