关于 zip 和io.Reader
/io.Writer
的问题。据我了解,io/Reader
/io.Writer
的目的之一是流媒体。但是,如果我的类型"作为块"没有真正的意义,我应该实现其中之一吗?
有关更多详细信息:
假设我有这个结构。
type MyZip struct {
file1, file2 []byte
}
MyZip
表示特定的结构化 zip。例如,假设它表示一个zip文件,其中包含一个名为file1
的文件和一个名为file2
的文件。MyZip
负责解析 zip 文件,以将这两个文件提取到两个[]byte
字段中。它还应该以相反的方式处理(将这两个[]byte
字段转换为名为test1
的两个文件,test2
存档为 zip 文件(。
据我了解,包archive/zip
不允许将zip文件解压缩为流。我们必须将zip完全加载到内存中或作为文件,然后解压缩。
因此,为了完善我的问题,MyZip
实现io.Reader
/io.Writer
来读取/写入最终zip文件是否有意义?
如上所述,由于我无法即时提取这两个文件,因此我必须向MyZip
添加某种缓冲区,然后从该缓冲区读取/写入。因此,zip 无论如何都会在流式传输之前完全存储在内存中。这是不使用io.Reader
/io.Writer
的反指示吗?
非常感谢您的启发!
据我了解,包
archive/zip
不允许将 zip 文件解压缩为流。我们必须将zip完全加载到内存中或作为文件,然后解压缩。
错。是的,某些元数据需要加载到内存中,但您不需要将所有内容加载到内存中。您可以从 zip 存档中提取单个文件。请参阅如何解压缩单个文件?
是的,zip.Reader
和zip.Writer
没有实现io.Reader
和io.Writer
,因为它们不是字节的单一来源或目标。但是其中的文件,它们是。因此,其中的文件实现了io.Reader
和io.Writer
.更具体地说,存档中的文件由一个zip.File
表示,该可用于获取io.Reader
以使用File.Open()
获取其(未压缩(内容。 当您使用 zip 存档添加新条目时,例如Writer.Create()
,这将返回一个io.Writer
,因为它表示字节的目标,您可以将文件的内容写入其中。
回到你的例子:MyZip
也不代表字节的单一来源或目标,所以它本身实现io.Reader
或io.Writer
是没有意义的,所以不要这样做。与archive/zip
类似,其中的各个文件可以这样做。