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

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

【问题讨论】:

  • 我猜这个库只支持 LZMA 而不是 xz 档案使用的 LZMA2。

标签: go xz


【解决方案1】:

您有 3 个选项。

  1. 尝试另一个库,也许是使用 cgo 的库。我看到两个here
  2. 直接使用 cgo/制作自己的 lib。
  3. 使用 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)
    }
}

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2014-02-17
    • 1970-01-01
    相关资源
    最近更新 更多