我正在开发一个使用golang将xml文件压缩为gzip的程序。
但是该程序无法生成文件,但是当我尝试将.txt文件转换为gzip时,它的确生成了输出。这是我的程序:-
package main
import (
"bytes"
"compress/gzip"
"fmt"
"io"
"log"
"os"
)
type Notes struct {
To string `xml:"to"`
From string `xml:"from"`
Heading string `xml:"heading"`
Body string `xml:"body"`
}
func main() {
var buf bytes.Buffer
zw := gzip.NewWriter(&buf)
// Setting the Header fields is optional.
zw.Name = "new.xml"
_, err := zw.Write([]byte("Compressing"))
if err != nil {
log.Fatal(err)
}
if err := zw.Close(); err != nil {
log.Fatal(err)
}
zr, err := gzip.NewReader(&buf)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Name: %s", zr.Name)
if _, err := io.Copy(os.Stdout, zr); err != nil {
log.Fatal(err)
}
if err := zr.Close(); err != nil {
log.Fatal(err)
}
}
要生成所需的.gz文件,我应该怎么做。
现在,zw.Write()
调用会将(压缩的)数据写入buff
。因为,相反,您想将其写入文件,所以您应该创建可以执行此操作的文件。
最简单的方法是使用os.Create()
。此函数返回一个*os.File
,它实现了io.Writer
。
结果代码将是这样的:
package main
import (
"compress/gzip"
"log"
"os"
)
func main() {
// This creates a file and returns an implementation of io.Writer
fileWriter, err := os.Create("./file.gz")
if err != nil {
log.Fatal(err)
}
// Use the io.Writer to create the gzip.Writer.
zw := gzip.NewWriter(fileWriter)
// Setting the Header fields is optional.
zw.Name = "new.xml"
// When gzip.Writer.Write is called, it will pass on the data to the Write func of the io.Writer we passed on line 17.
// If there is an error writing to the actual file, it will be returned.
_, err = zw.Write([]byte("Compressing"))
if err != nil {
log.Fatal(err)
}
// This closes the gzip writer
if err := zw.Close(); err != nil {
log.Fatal(err)
}
// This closes the actual file.
if err := fileWriter.Close(); err != nil {
log.Fatal(err)
}
}