Как я могу читать xz файлов в программе go? Когда я пытаюсь прочитать их, используя lzma
, я получаю ошибку error in lzma header
.Чтение xz файлов в go
ответ
У вас есть 3 варианта.
- Попробуйте использовать другую библиотеку, возможно, использующую cgo. Я вижу два here.
- Используйте cgo напрямую/создайте собственную библиотеку.
- Используйте исполняемый файл 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
}
Runnable код здесь: http://play.golang.org/p/SrgZiKdv9a
Спасибо, я как-то пропустил и godoc.org, и этот удивительно простой трубопровод. – phihag
Ваше решение Option 3 обычно полезно для широкого диапазона команд оболочки, которые должны быть включены в программы Go. –
Я недавно создал пакет декомпрессионной XZ. Это не требует Cgo. Вы можете найти его здесь:
Программа для распаковки стандартного ввода на стандартный вывод:
package main
import (
"io"
"log"
"os"
"xi2.org/x/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)
}
}
Я предполагаю, что эта библиотека поддерживает только LZMA и не LZMA2, который используется 'xz' архивов , – nemo