在 go 中读取 xz 文件

Posted

技术标签:

【中文标题】在 go 中读取 xz 文件【英文标题】:Read xz files in go 【发布时间】:2013-10-24 01:36:15 【问题描述】:

如何在 go 程序中读取 xz 文件?当我尝试使用lzma 阅读它们时,我收到error in lzma header 错误。

【问题讨论】:

我猜这个库只支持 LZMA 而不是 xz 档案使用的 LZMA2。 【参考方案1】:

您有 3 个选项。

    尝试另一个库,也许是使用 cgo 的库。我看到两个here。 直接使用 cgo/制作自己的 lib。 使用 xz 可执行文件。

选项三比听起来容易。这是我会使用的:

func xzReader(r io.Reader) io.ReadCloser 
    rpipe, wpipe := io.Pipe()

    cmd := exec.Command("xz", "--decompress", "--stdout")
    cmd.Stdin = r
    cmd.Stdout = wpipe

    go func() 
        err := cmd.Run()
        wpipe.CloseWithError(err)
    ()

    return rpipe

此处可运行代码:http://play.golang.org/p/SrgZiKdv9a

【讨论】:

谢谢,我不知何故错过了 godoc.org 和这个非常简单的管道。 您的选项 3 解决方案通常适用于将各种 shell 命令合并到 Go 程序中。【参考方案2】:

我最近创建了一个 XZ 解压包。它不需要 Cgo。你可以在这里找到它:

https://github.com/xi2/xz

一个将标准输入解压到标准输出的程序:

package main

import (
    "io"
    "log"
    "os"

    "github.com/xi2/xz"
)

func main() 
    r, err := xz.NewReader(os.Stdin, 0)
    if err != nil 
        log.Fatal(err)
    
    _, err = io.Copy(os.Stdout, r)
    if err != nil 
        log.Fatal(err)
    

【讨论】:

以上是关于在 go 中读取 xz 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中从 S3 读取 .xz 文件

是否可以在 golang 中提取 tar.xz 包?

是否可以在 Go 中读取 .mat 文件?

在 Go 中逐行读取文件

如何在最短的时间内读取 1TB 压缩文件 [关闭]

从读取 .go 文件中反思结构类型