Q3.3 : zipファイルの書き込み
OSのデバイスにリンクされたio.Writer
やio.Reader
は、1つのファイルやデバイスと1対1に対応しています。Go言語が提供するライブラリには、1つのファイルで複数のio.Writer
やio.Reader
に対応しているものもあります。
複数ファイルを格納するアーカイブフォーマットであるtar
やzip
ファイルや、インターネットのマルチパート形式(ブラウザのフォームによって作られるデータやファイルを複数格納するデータ構造)をサポートするmime/multipart
パッケージの構造体は、中に格納されるひとつひとつの要素がio.Writer
やio.ReadCloser
になっています。
archive/zip
パッケージを使ってzipファイルを作成してみましょう。出力先のファイルのWriter
(以下のコードのfile
)をまず作って、それをzip.NewWriter()
関数に渡すと、zipファイルの書き込み用の構造体が出来ます。最後にClose()
を確実に呼ぶ必要がありますが、これにはGo言語のdefer
という機能を使って次のようにすればよいでしょう。
zipWriter := zip.NewWriter()
defer zipWriter.Close()
この構造体そのものはio.Writer
ではありませんが、Create()
メソッドを呼ぶと、個別のファイルを書き込むためのio.Writer
が返ってきます。
writer, err := zipWriter.Create("newfile.txt")
上記の例では、newfile.txt
という実際のファイルが、最初に作った出力先ファイルfile
へと圧縮されます。では、実際のファイルではなく、文字列strings.Reader
を使ってzipファイルを作成するにはどうすればいいでしょうか。考えてみてください。
Result
$ gor zipstrings.go
$ unzip temp.zip
Archive: temp.zip
inflating: test
$ cat test
content of file in zip%