golang 读取压缩包文件 && 写文件

昨天刚上完线,大早上起来看到北京下雪一夜,积了好多的雪,此情此景我等码农墨客,一定要写点代码,感慨一下这个雪好大,可惜,一到单位就接到了线上故障(是我昨天上线干的,有个NPE,赶紧修复回复了用户),接着又要跟FE联调新功能,功能反正发沙盒了,让他自己慢慢调接口吧,golang我来了,继续占老板的便宜提升自己。
golang提供了compress 包:读取压缩文件,支持的压缩文件格式为:bzip2、flate、gzip、lzw 和 zlib。

dart 复制代码
package main

import (
	"fmt"
	"bufio"
	"os"
	"compress/gzip"
)

func main() {
	// 文件,路劲自己改下,改成你本机的
	fName := "MyFile.gz"
	// 声明一个指针Reader,为什么每次都要声明指针?因为看源码bufio.NewReader中他就返回了一个指针Reader
	var r *bufio.Reader
	// 打开文件
	fi, err := os.Open(fName)
	if err != nil {
		fmt.Fprintf(os.Stderr, "%v, Can't open %s: error: %s\n", os.Args[0], fName,
			err)
		os.Exit(1)
	}
	defer fi.Close()
	// gzip.NewReader创建一个gzip文件输入对象
	fz, err := gzip.NewReader(fi)
	if err != nil {
		// 创建一个带有固定缓冲区大小的文件输入对象
		r = bufio.NewReader(fi)
	} else {
		// 创建一个带有固定缓冲区大小的文件输入对象
		r = bufio.NewReader(fz)
	}

	for {
		// 按行读取数据
		line, err := r.ReadString('\n')
		if err != nil {
			fmt.Println("Done reading file")
			os.Exit(0)
		}
		fmt.Println(line)
	}
}

写文件

go 复制代码
package main

import (
	"os"
	"bufio"
	"fmt"
)

func main () {
	// var outputWriter *bufio.Writer
	// var outputFile *os.File
	// var outputError os.Error
	// var outputString string
	// 文件不在则自动创建,output.data这里改成你自己的路劲
	// OpenFile 函数有三个参数:文件名、一个或多个标志(使用逻辑运算符 | 连接),使用的文件权限
	// os.O_RDONLY:只读
	// os.O_WRONLY:只写
	// os.O_CREATE:创建:如果指定文件不存在,就创建该文件。
	// os.O_TRUNC:截断:如果指定文件已存在,就将该文件的长度截为 0 
	// 在读文件的时候,文件的权限是被忽略的,所以在使用 OpenFile() 时传入的第三个参数可以用 0 。而在写文件时,不管是 Unix 还是 Windows,都需要使用 0666
	outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666)
	if outputError != nil {
		fmt.Printf("An error occurred with file opening or creation\n")
		return  
	}
	defer outputFile.Close()
	// 创建一个写入器(缓冲区)对象
	outputWriter := bufio.NewWriter(outputFile)
	outputString := "hello world!\n"
	// 将字符串写入缓冲区,写 10 次
	for i:=0; i<10; i++ {
		outputWriter.WriteString(outputString)
	}
	outputWriter.Flush()
}

写文件V2,如果写入的东西很简单,我们可以使用 fmt.Fprintf(outputFile, "Some test data.\n") 直接将内容写入文件。fmt 包里的 F... 开头的 Print() 函数可以直接写入任何 io.Writer,包括文件

go 复制代码
package main

import "os"

func main() {
	// 输出到屏幕的写法
	os.Stdout.WriteString("hello, world\n")
	f, _ := os.OpenFile("test", os.O_CREATE|os.O_WRONLY, 0666)
	defer f.Close()
	// 写文件内容
	f.WriteString("hello, world in a file\n")
}
相关推荐
weixin_472339464 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
枯萎穿心攻击4 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue6 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
m0_555762906 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
浪裡遊7 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
lzb_kkk8 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
好开心啊没烦恼8 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
简佐义的博客9 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
程序员爱钓鱼9 小时前
【无标题】Go语言中的反射机制 — 元编程技巧与注意事项
开发语言·qt