第12章 文件读写 2018.06.28-2018.06.29
主要涉及的库有 os io bufio
打开文件:
inputFile,err := os.Open(filename) //这里inputFile将会是一个*File的指针,err返回打开文件时的错误信息
打开文件后,一定要注意需要关闭文件,通过下面的语句来实现
defer inputFile.Close()
然后创建一个reader
inputReader := bufio.NewReader(inputFile) //建返回一个Reader指针
《1》读取一行: line := inputReader.ReadLine()
《2》按照分隔符读取: str ,err := inputReader.ReadString('\n')
《3》读取到缓冲区
buffer := make([]byte,1024) //创建缓冲区
n , error := inputReader.Read(buffer) //将数据读取到缓冲区,n表示读取到的字节数,error表示错误信息
《4》读取整个文件到缓冲区
buffer,error := ioutil.ReadFile(inputFileName) //一次性将文件读取到缓冲区
err := ioutil.WriteFile(outFileName,buffer,0x644) //将缓冲区的数据写到文件中
《5》从文件中读取一行到指定的变量中
fmt.Fscanln(file,&var1,&var2,&var3)
《6》 读取压缩文件
import "compress/gzip" //引入压缩包
file,err := os.Open(filename) //打开文件,获取*File
fz , err := gzip.NewReader(file) //获取gzip Reader实例
r , err := bufio.NewReader(fz) //获取*Reader实例
接下来的步骤和正常的读取步骤一样
《7》 文件写的过程
outputFile, outputError := os.OpenFile(filename,O_WRITEONLY|O_CREATE,0666) //打开文件,设置打开方式及读写权限
defer outputFile.Close() //记得程序退出时关闭文件
outputWriter := bufio.NewWriter(outputFile) //获取一个*Writer
outputWriter.WriteString("fuck you !") // 写入数据
outputWriter.Flush()
《8》读取整个文件的过程可以使用ioutil.ReadFile
写入整个文件的过程可以使用ioutil.WriteFile
《9》文件的复制 ioutil.Copy(dst,src) //直接将src复制到dst ,这里需要注意参数的位置
《10》flag包可以帮助我们处理命令行参数
type flag struct {
Name string //name as it appears on commandline
Usage string // help message
Value Value // value as set
DefValue string // default value (as text) ; for usage message
}
获取命令行参数的个数:flag.NArg()
获取第i个参数: flag.Arg(i)
《11》JSON 文件格式的读取(重点关注,尝试开源包)
json的局限性:
不是所有的类型都可以转成json
json的key必须是string类型
循环嵌套的数据类型不支持
指针类型会被提取出内容并加封
json encode数据的方法: js,_ := json.Marshal(go_object)
json encode数据到文件中 :
file , _ := os.OpenFile(filename,os.O_CREATE|os.O_WRITEOLY,0666)
enc := json.NewEncoder(file)
err := enc.Encode(go_object)
json 的数据类型和 Go的数据类型的对应关系:
bool <-----------> json boolean
float64 <------------> json numbers
string <-------------> json string
nil <-------------> json null
《12》XML文件格式的读取
xml格式文件的读取类似于json格式的读取
input := xmlcontentstring
inputReader := strings.NewReader(input)
p:= xml.NewDecoder(inputReader)
for t,err = p.Token(); err == nil ; t ,err = p.Token(){
switch token := t.(type) {
case xml.StartElement:
name := token.Name.Local
fmt.Printf("Token name :%s \n",name)
for _ , attr :=range token.Attr {
attrName := attr.Name.Local
attrValue := attr.Value
fmt.Printf("An attribute is : %s %s \n",attrName,attrValue)
}
case xml.EndElement:
name := token.Name.Local
fmt.Println("End of token",name)
case xml.CharData:
content := string([]byte(token))
fmt.Printf("This is content : %v \n",content)
default:
}
}
《13》GOB文件格式的读取
gob是go binary format的简称,gob是go专属的二进制的格式,使用方法和json类似
《14》加密摘要算法的使用
sha1,md5 这些常用的必须掌握
hasher := md5.New() // 创建算法的实例
b := []byte{} //md5值的存储之地
io.WriteString(hasher,content) //写入方式一
content := []byte("blablabla")
nbytes , err := hash.Write(content) //写入方式二
checksum := hasher.Sum(b)
hasher.Reset() //清空内容