江户川乱折腾
请注意,错误表示输入后偏移处的数据已损坏。那是因为您从文件中读取的方式: buf := make([]byte, 100000) n, readErr := f.Read(buf) if readErr != nil { log.Fatalf("readErr=%v\n", readErr) } fmt.Printf("Read bytes, n=%v\n", n) buffer := bytes.NewBuffer(buf) zlibReader, zlibErr := zlib.NewReader(buffer) if zlibErr != nil { log.Fatalf("zlibErr=%v\n", zlibErr) }buf := make([]byte, 100000)将制作一个 100000 字节的切片,全部为 0。但在all.in. 由于您从不缩短切片,因此阅读器将在有效数据之后遇到几千个零并断定它已损坏。这就是你得到输出和错误的原因。至于流媒体。在 TCP/UDP 连接的情况下,您应该能够将 a 连接传递io.Reader给zlib.NewReader. 为了模拟相同的内容,我在修改后的代码中使用了io.Pipe:package mainimport ( "bytes" "compress/zlib" "fmt" "io" "log" "os" otherzlib "github.com/4kills/go-zlib")func main() { all() stream() // Alas it hangs :( // otherZlib()}func all() { fmt.Println("==== RUNNING DECOMPRESSION OF all.in") fmt.Println("") buf, readErr := os.ReadFile("./chunks/all.in") if readErr != nil { log.Fatalf("readErr=%v\n", readErr) } fmt.Printf("Read bytes, n=%v\n", len(buf)) buffer := bytes.NewBuffer(buf) zlibReader, zlibErr := zlib.NewReader(buffer) if zlibErr != nil { log.Fatalf("zlibErr=%v\n", zlibErr) } out := new(bytes.Buffer) written, copyErr := io.Copy(out, zlibReader) if copyErr != nil { log.Printf("copyErr=%v\n", copyErr) } fmt.Printf("Written bytes, n=%v, out:\n%v\n", written, out.String()) fmt.Println("")}func stream() { fmt.Println("==== RUNNING DECOMPRESSION OF SEPARATE CHUNKS") fmt.Println("") pRead, pWrite := io.Pipe() go func() { buf, readErr := os.ReadFile("./chunks/0.in") if readErr != nil { log.Fatalf("readErr=%v\n", readErr) } fmt.Printf("Read 0 bytes, n=%v\n", len(buf)) written0, copy0Err := io.Copy(pWrite, bytes.NewBuffer(buf)) if copy0Err != nil { log.Printf("copy0Err=%v\n", copy0Err) } fmt.Printf("Written compressed bytes, n0=%v", written0) buf, readErr = os.ReadFile("./chunks/1.in") if readErr != nil { log.Fatalf("read1Err=%v\n", readErr) } fmt.Printf("Read 1 bytes, n=%v\n", len(buf)) written1, copy1Err := io.Copy(pWrite, bytes.NewBuffer(buf)) if copy1Err != nil { log.Printf("copy1Err=%v\n", copy1Err) } fmt.Printf("Written compressed bytes, n1=%v", written1) pWrite.Close() }() zlibReader, zlibErr := zlib.NewReader(pRead) if zlibErr != nil { log.Fatalf("zlibErr=%v\n", zlibErr) } out := new(bytes.Buffer) written2, copy2Err := io.Copy(out, zlibReader) if copy2Err != nil { log.Printf("copy2Err=%v\n", copy2Err) } fmt.Printf("Written decompressed bytes, n0=%v, out:\n%v\n", written2, out.String()) fmt.Println("")}使用此代码,我没有收到任何错误,stream()但我仍然收到copyErr=unexpected EOF错误all(),看起来最后all.in缺少校验和数据,但我认为这只是一个意外。