xref: /aosp_15_r20/build/soong/third_party/zip/example_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2012 The Go Authors. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style
3*333d2b36SAndroid Build Coastguard Worker// license that can be found in the LICENSE file.
4*333d2b36SAndroid Build Coastguard Worker
5*333d2b36SAndroid Build Coastguard Workerpackage zip_test
6*333d2b36SAndroid Build Coastguard Worker
7*333d2b36SAndroid Build Coastguard Workerimport (
8*333d2b36SAndroid Build Coastguard Worker	"archive/zip"
9*333d2b36SAndroid Build Coastguard Worker	"bytes"
10*333d2b36SAndroid Build Coastguard Worker	"compress/flate"
11*333d2b36SAndroid Build Coastguard Worker	"fmt"
12*333d2b36SAndroid Build Coastguard Worker	"io"
13*333d2b36SAndroid Build Coastguard Worker	"log"
14*333d2b36SAndroid Build Coastguard Worker	"os"
15*333d2b36SAndroid Build Coastguard Worker)
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerfunc ExampleWriter() {
18*333d2b36SAndroid Build Coastguard Worker	// Create a buffer to write our archive to.
19*333d2b36SAndroid Build Coastguard Worker	buf := new(bytes.Buffer)
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	// Create a new zip archive.
22*333d2b36SAndroid Build Coastguard Worker	w := zip.NewWriter(buf)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	// Add some files to the archive.
25*333d2b36SAndroid Build Coastguard Worker	var files = []struct {
26*333d2b36SAndroid Build Coastguard Worker		Name, Body string
27*333d2b36SAndroid Build Coastguard Worker	}{
28*333d2b36SAndroid Build Coastguard Worker		{"readme.txt", "This archive contains some text files."},
29*333d2b36SAndroid Build Coastguard Worker		{"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
30*333d2b36SAndroid Build Coastguard Worker		{"todo.txt", "Get animal handling licence.\nWrite more examples."},
31*333d2b36SAndroid Build Coastguard Worker	}
32*333d2b36SAndroid Build Coastguard Worker	for _, file := range files {
33*333d2b36SAndroid Build Coastguard Worker		f, err := w.Create(file.Name)
34*333d2b36SAndroid Build Coastguard Worker		if err != nil {
35*333d2b36SAndroid Build Coastguard Worker			log.Fatal(err)
36*333d2b36SAndroid Build Coastguard Worker		}
37*333d2b36SAndroid Build Coastguard Worker		_, err = f.Write([]byte(file.Body))
38*333d2b36SAndroid Build Coastguard Worker		if err != nil {
39*333d2b36SAndroid Build Coastguard Worker			log.Fatal(err)
40*333d2b36SAndroid Build Coastguard Worker		}
41*333d2b36SAndroid Build Coastguard Worker	}
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker	// Make sure to check the error on Close.
44*333d2b36SAndroid Build Coastguard Worker	err := w.Close()
45*333d2b36SAndroid Build Coastguard Worker	if err != nil {
46*333d2b36SAndroid Build Coastguard Worker		log.Fatal(err)
47*333d2b36SAndroid Build Coastguard Worker	}
48*333d2b36SAndroid Build Coastguard Worker}
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Workerfunc ExampleReader() {
51*333d2b36SAndroid Build Coastguard Worker	// Open a zip archive for reading.
52*333d2b36SAndroid Build Coastguard Worker	r, err := zip.OpenReader("testdata/readme.zip")
53*333d2b36SAndroid Build Coastguard Worker	if err != nil {
54*333d2b36SAndroid Build Coastguard Worker		log.Fatal(err)
55*333d2b36SAndroid Build Coastguard Worker	}
56*333d2b36SAndroid Build Coastguard Worker	defer r.Close()
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker	// Iterate through the files in the archive,
59*333d2b36SAndroid Build Coastguard Worker	// printing some of their contents.
60*333d2b36SAndroid Build Coastguard Worker	for _, f := range r.File {
61*333d2b36SAndroid Build Coastguard Worker		fmt.Printf("Contents of %s:\n", f.Name)
62*333d2b36SAndroid Build Coastguard Worker		rc, err := f.Open()
63*333d2b36SAndroid Build Coastguard Worker		if err != nil {
64*333d2b36SAndroid Build Coastguard Worker			log.Fatal(err)
65*333d2b36SAndroid Build Coastguard Worker		}
66*333d2b36SAndroid Build Coastguard Worker		_, err = io.CopyN(os.Stdout, rc, 68)
67*333d2b36SAndroid Build Coastguard Worker		if err != nil {
68*333d2b36SAndroid Build Coastguard Worker			log.Fatal(err)
69*333d2b36SAndroid Build Coastguard Worker		}
70*333d2b36SAndroid Build Coastguard Worker		rc.Close()
71*333d2b36SAndroid Build Coastguard Worker		fmt.Println()
72*333d2b36SAndroid Build Coastguard Worker	}
73*333d2b36SAndroid Build Coastguard Worker	// Output:
74*333d2b36SAndroid Build Coastguard Worker	// Contents of README:
75*333d2b36SAndroid Build Coastguard Worker	// This is the source code repository for the Go programming language.
76*333d2b36SAndroid Build Coastguard Worker}
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Workerfunc ExampleWriter_RegisterCompressor() {
79*333d2b36SAndroid Build Coastguard Worker	// Override the default Deflate compressor with a higher compression level.
80*333d2b36SAndroid Build Coastguard Worker
81*333d2b36SAndroid Build Coastguard Worker	// Create a buffer to write our archive to.
82*333d2b36SAndroid Build Coastguard Worker	buf := new(bytes.Buffer)
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Worker	// Create a new zip archive.
85*333d2b36SAndroid Build Coastguard Worker	w := zip.NewWriter(buf)
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker	// Register a custom Deflate compressor.
88*333d2b36SAndroid Build Coastguard Worker	w.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) {
89*333d2b36SAndroid Build Coastguard Worker		return flate.NewWriter(out, flate.BestCompression)
90*333d2b36SAndroid Build Coastguard Worker	})
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Worker	// Proceed to add files to w.
93*333d2b36SAndroid Build Coastguard Worker}
94