package zstd_test import ( "archive/zip" "bytes" "fmt" "io" "github.com/klauspost/compress/zstd" ) func ExampleZipCompressor() { // Get zstandard de/compressors for zip. // These can be used by multiple readers and writers. compr := zstd.ZipCompressor(zstd.WithWindowSize(1<<20), zstd.WithEncoderCRC(false)) decomp := zstd.ZipDecompressor() // Try it out... var buf bytes.Buffer zw := zip.NewWriter(&buf) zw.RegisterCompressor(zstd.ZipMethodWinZip, compr) zw.RegisterCompressor(zstd.ZipMethodPKWare, compr) // Create 1MB data tmp := make([]byte, 1<<20) for i := range tmp { tmp[i] = byte(i) } w, err := zw.CreateHeader(&zip.FileHeader{ Name: "file1.txt", Method: zstd.ZipMethodWinZip, }) if err != nil { panic(err) } w.Write(tmp) // Another... w, err = zw.CreateHeader(&zip.FileHeader{ Name: "file2.txt", Method: zstd.ZipMethodPKWare, }) w.Write(tmp) zw.Close() zr, err := zip.NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len())) if err != nil { panic(err) } zr.RegisterDecompressor(zstd.ZipMethodWinZip, decomp) zr.RegisterDecompressor(zstd.ZipMethodPKWare, decomp) for _, file := range zr.File { rc, err := file.Open() if err != nil { panic(err) } b, err := io.ReadAll(rc) rc.Close() if bytes.Equal(b, tmp) { fmt.Println(file.Name, "ok") } else { fmt.Println(file.Name, "mismatch") } } // Output: // file1.txt ok // file2.txt ok }