在Go语言中读取xz文件。

huangapple go评论83阅读模式
英文:

Read xz files in go

问题

你可以在Go程序中如何读取xz文件?当我尝试使用lzma读取时,出现了error in lzma header错误。

英文:

How can I read xz files in a go program? When I try to read them using lzma, I get an error in lzma header error.

答案1

得分: 9

你有3个选项。

  1. 尝试另一个库,也许是使用cgo的库。我在这里找到了两个链接
  2. 直接使用cgo/制作自己的库。
  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

英文:

You have 3 options.

  1. Try another library, perhaps one that uses cgo. I see two here.
  2. Use cgo directly/make your own lib.
  3. Use the xz executable.

Option three is easier than it sounds. Here is what I would use:

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
}

Runnable code here: http://play.golang.org/p/SrgZiKdv9a

答案2

得分: 2

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

<https://github.com/xi2/xz>

一个将stdin解压缩到stdout的程序:

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)
    }
}
英文:

I recently created an XZ decompression package. It does not require Cgo. You can find it here:

<https://github.com/xi2/xz>

A program to decompress stdin to stdout:

package main

import (
    &quot;io&quot;
    &quot;log&quot;
    &quot;os&quot;

    &quot;github.com/xi2/xz&quot;
)

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)
    }
}

huangapple
  • 本文由 发表于 2013年10月24日 09:36:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/19555373.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定