第12章? 文件讀寫(xiě)? 2018.06.28-2018.06.29
主要涉及的庫(kù)有? os? io? bufio
打開(kāi)文件:
inputFile,err := os.Open(filename)? //這里inputFile將會(huì)是一個(gè)*File的指針,err返回打開(kāi)文件時(shí)的錯(cuò)誤信息
打開(kāi)文件后,一定要注意需要關(guān)閉文件,通過(guò)下面的語(yǔ)句來(lái)實(shí)現(xiàn)
defer inputFile.Close()
然后創(chuàng)建一個(gè)reader
inputReader := bufio.NewReader(inputFile)? //建返回一個(gè)Reader指針
《1》讀取一行:? line := inputReader.ReadLine()
《2》按照分隔符讀?。? str ,err := inputReader.ReadString('\n')
《3》讀取到緩沖區(qū)?
? ? ? ? ? ? buffer := make([]byte,1024)? //創(chuàng)建緩沖區(qū)
? ? ? ? ? ? n , error := inputReader.Read(buffer) //將數(shù)據(jù)讀取到緩沖區(qū),n表示讀取到的字節(jié)數(shù),error表示錯(cuò)誤信息
《4》讀取整個(gè)文件到緩沖區(qū)
? ? ? ? ? ? buffer,error := ioutil.ReadFile(inputFileName) //一次性將文件讀取到緩沖區(qū)
? ? ? ? ? ? err := ioutil.WriteFile(outFileName,buffer,0x644) //將緩沖區(qū)的數(shù)據(jù)寫(xiě)到文件中
《5》從文件中讀取一行到指定的變量中
? ? ? ? ? fmt.Fscanln(file,&var1,&var2,&var3)
《6》 讀取壓縮文件
? ? ? ? ? ? import "compress/gzip"? ? //引入壓縮包
? ? ? ? ? ? file,err := os.Open(filename)? ? //打開(kāi)文件,獲取*File
? ? ? ? ? ? fz , err := gzip.NewReader(file)? //獲取gzip Reader實(shí)例
? ? ? ? ? ? r ,? err := bufio.NewReader(fz)? ? //獲取*Reader實(shí)例
? ? ? ? ? ? 接下來(lái)的步驟和正常的讀取步驟一樣
《7》 文件寫(xiě)的過(guò)程
? ? ? ? ? ? outputFile, outputError := os.OpenFile(filename,O_WRITEONLY|O_CREATE,0666) //打開(kāi)文件,設(shè)置打開(kāi)方式及讀寫(xiě)權(quán)限
? ? ? ? ? ? defer outputFile.Close()? //記得程序退出時(shí)關(guān)閉文件
? ? ? ? ? ? outputWriter := bufio.NewWriter(outputFile)? //獲取一個(gè)*Writer
? ? ? ? ? ? outputWriter.WriteString("fuck you !") // 寫(xiě)入數(shù)據(jù)
? ? ? ? ? ? outputWriter.Flush()
《8》讀取整個(gè)文件的過(guò)程可以使用ioutil.ReadFile
? ? ? ? ? 寫(xiě)入整個(gè)文件的過(guò)程可以使用ioutil.WriteFile
《9》文件的復(fù)制? ioutil.Copy(dst,src)? //直接將src復(fù)制到dst ,這里需要注意參數(shù)的位置
《10》flag包可以幫助我們處理命令行參數(shù)
? ? ? ? ? ? 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
? ? ? ? ? ? }
獲取命令行參數(shù)的個(gè)數(shù):flag.NArg()?
獲取第i個(gè)參數(shù): flag.Arg(i)
《11》JSON 文件格式的讀取(重點(diǎn)關(guān)注,嘗試開(kāi)源包)
? ? ? ? json的局限性:
? ? ? ? ? ? ? ? 不是所有的類(lèi)型都可以轉(zhuǎn)成json
? ? ? ? ? ? ? ? json的key必須是string類(lèi)型
? ? ? ? ? ? ? ? 循環(huán)嵌套的數(shù)據(jù)類(lèi)型不支持
? ? ? ? ? ? ? ? 指針類(lèi)型會(huì)被提取出內(nèi)容并加封
? ? ? ? ? ? json encode數(shù)據(jù)的方法: ? js,_ := json.Marshal(go_object)?
? ? ? ? ? ? json encode數(shù)據(jù)到文件中 :
? ? ? ? ? ? file , _ := os.OpenFile(filename,os.O_CREATE|os.O_WRITEOLY,0666)
? ? ? ? ? ? enc := json.NewEncoder(file)?
? ? ? ? ? ? err := enc.Encode(go_object)?
? ? ? ? ? ? json 的數(shù)據(jù)類(lèi)型和 Go的數(shù)據(jù)類(lèi)型的對(duì)應(yīng)關(guān)系:
? ? ? ? ? ? bool ?<-----------> ?json boolean
? ? ? ? ? ? float64 <------------> ?json ?numbers
? ? ? ? ? ? string ?<-------------> json string?
? ? ? ? ? ? nil ? <-------------> ?json null?
《12》XML文件格式的讀取
? ? ? ? ? ? xml格式文件的讀取類(lèi)似于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的簡(jiǎn)稱(chēng),gob是go專(zhuān)屬的二進(jìn)制的格式,使用方法和json類(lèi)似
《14》加密摘要算法的使用
sha1,md5 這些常用的必須掌握
hasher := md5.New() ? // 創(chuàng)建算法的實(shí)例
b := []byte{} ?//md5值的存儲(chǔ)之地
io.WriteString(hasher,content) ?//寫(xiě)入方式一
content := []byte("blablabla")?
nbytes , err := hash.Write(content) ?//寫(xiě)入方式二
checksum := hasher.Sum(b)?
hasher.Reset() ?//清空內(nèi)容