Question regarding zip and io.Reader
/io.Writer
. As far as I understand, one of the purpose of io/Reader
/io.Writer
is streaming. But should I implement one of these if my type does not really make sense "as chunks"?
For more details:
Lets say I have this struct.
type MyZip struct {
file1, file2 []byte
}
MyZip
represents a particular structured zip. Let's say for example it represents a zip file containing exactly a file named file1
and a file named file2
. MyZip
has the responsibility of parsing a zip file to extract these two files into two []byte
fields. It also should handle the other way around (turning these two []byte
fields as two files named test1
and test2
archived into a zip file).
As far as I understand, the package archive/zip
does not allow to decompress a zip file as a stream. We have to fully load the zip in memory or as a file and decompress afterwards.
So to refine my question, does it make sense for MyZip
to implement io.Reader
/io.Writer
for reading/writing from/to the final zip file?
As said above, as I cannot extract the two files on the fly, I would have to add some sort of buffer to MyZip
and just read/write from/to this buffer. So the zip would anyway be fully stored in memory before being streamed. Is it a counter indication for not using io.Reader
/io.Writer
?
Thanks a lot for shedding light!
As far as I understand, the package
archive/zip
does not allow to decompress a zip file as a stream. We have to fully load the zip in memory or as a file and decompress afterwards.
Wrong. Some metadata needs to be loaded into memory, yes, but you do not need to load everything into memory. You can extract individual files from a zip archive. See How to unzip a single file?
Yes, zip.Reader
and zip.Writer
doesn't implement io.Reader
and io.Writer
, because they are not a single source or target of bytes. But the files in them, they are. So the files in them implement io.Reader
and io.Writer
. More specifically a file in an archive is represented by a zip.File
which may be used to obtain an io.Reader
to get its (uncompressed) content using File.Open()
. When you add a new entry to a zip archive using e.g. Writer.Create()
, that returns you an io.Writer
because that represents a target of bytes, you can write the file's content into it.
Back to your exmaple: MyZip
also does not represent a single source or destination of bytes, so it doesn't make sense to itself implement io.Reader
or io.Writer
, so don't do it. Similarly to archive/zip
, the individual files in it may do so.