我应该实现io吗?读者/io.作家,如果我的类型作为流没有意义?



关于 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.Readerzip.Writer没有实现io.Readerio.Writer,因为它们不是字节的单一来源或目标。但是其中的文件,它们是。因此,其中的文件实现了io.Readerio.Writer.更具体地说,存档中的文件由一个zip.File表示,该可用于获取io.Reader以使用File.Open()获取其(未压缩(内容。 当您使用 zip 存档添加新条目时,例如Writer.Create(),这将返回一个io.Writer,因为它表示字节的目标,您可以将文件的内容写入其中。

回到你的例子:MyZip也不代表字节的单一来源或目标,所以它本身实现io.Readerio.Writer是没有意义的,所以不要这样做。与archive/zip类似,其中的各个文件可以这样做。

最新更新