json - 写入 bzip2 存档
问题描述
我正在处理多个文件,我需要使用此处提供的包将这些.json
文件添加到单个存档中: https ://github.com/larzconwell/bzip2 。.zip
我已经参考了其他可能的解决方案和问题io.Writer
,.Close()
以及.Flush()
使用的代码:
if processedCounter%*filesInPackage == 0 || filesLeftToProcess == 0 {
// Create empty zip file with numbered filename.
emptyZip, err := os.Create(filepath.Join(absolutePathOutputDirectory, "package_"+strconv.Itoa(packageCounter)+".zip"))
if err != nil {
panic(err)
}
// Get list of .json filenames to be packaged:
listOfProcessedJSON := listFiles(absolutePathInterDirectory, ".json")
bzipWriter, err := bzip2.NewWriterLevel(emptyZip, 1)
if err != nil {
panic(err)
}
defer bzipWriter.Close()
// Add listed files to the archive
for _, file := range listOfProcessedJSON {
// Read byte array from json file:
JSONContents, err := ioutil.ReadFile(file)
if err != nil {
fmt.Printf("Failed to open %s: %s", file, err)
}
// Write a single JSON to .zip:
// Process hangs here!
_, compressionError := bzipWriter.Write(JSONContents)
if compressionError != nil {
fmt.Printf("Failed to write %s to zip: %s", file, err)
compressionErrorCounter++
}
err = bzipWriter.Close()
if err != nil {
fmt.Printf("Failed to Close bzipWriter")
}
}
// Delete intermediate .json files
dir, err := ioutil.ReadDir(absolutePathInterDirectory)
for _, d := range dir {
os.RemoveAll(filepath.Join([]string{"tmp", d.Name()}...))
}
packageCounter++
}
使用调试器似乎我的程序挂在以下行:
_, compressionError := bzipWriter.Write(JSONContents)
该软件包本身不提供使用示例,因此我的知识基于研究文档、StackOverflow 问题和不同的可用文章,例如:
https://www.golangprograms.com/go-program-to-compress-list-of-files-into-zip.html
让我知道是否有人知道此问题的可能解决方案。
解决方案
您混淆了格式和它们的作用,可能是因为它们包含一个公共子字符串“zip”。zip 是一种存档格式,旨在包含多个文件。bzip2 是单流压缩器,不是存档格式,只能存储一个文件。gzip 在这方面与 bzip2 相同。gzip、bzip2、xz 和其他单文件压缩器都通常与 tar 一起使用,以归档多个文件及其目录结构。tar 将多个文件和结构收集到一个未压缩的文件中,然后由您选择的压缩器对其进行压缩。
zip 格式的工作方式不同,其中存档格式位于外部,存档中的每个条目都是单独压缩的。
无论如何,单独使用 bzip2 包将无法归档多个文件。
推荐阅读
- c# - 从一个脚本到另一个 c# 的值
- python - 我们可以在另一个 python 文件中使用一个 python 文件的会话吗?
- kotlin - 创建意图导致“尝试调用虚拟方法'java.lang.String android.content.Context.getPackageName()'”
- c# - ASP MVC 中的一个视图中的两个模型
- pointers - 清除截断指针的更快或更慢的方法?
- javascript - 点击一个按钮并使用 Wikipedia api 获得结果
- python - 如何在 Windows 中安装 Networkit python?
- postgresql - 循环新记录
- c++ - 动态规划中的旅行商问题
- javascript - 谷歌字体如何动态加载字体