日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go语言学习笔记(十八)之文件读写

發布時間:2024/4/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go语言学习笔记(十八)之文件读写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

25.文件讀寫

1.文件打開和讀

A.文件分類:文本和二進制文件
B.文件存取方式:隨機存取和順序存取

文件打開代碼示例:

1: package main 2: 3: import ( 4: "bufio" 5: "fmt" 6: "io" 7: "os" 8: ) 9: 10: func main() { 11: //只讀的方式打開 12: inputFile, err := os.Open("input.dat") 13: if err != nil { 14: fmt.Printf("open file err:%v\n", err) 15: return 16: } 17: defer inputFile.Close() 18: }

讀文件

file.Read和file.ReadAt.

讀到文件末尾返回:io.EOF

讀出整個文件代碼示例

1: package main 2: 3: import ( 4: "fmt" 5: "io" 6: "os" 7: ) 8: 9: func main() { 10: //只讀的方式打開 11: inputFile, err := os.Open(`D:\project\goland\files\wenjianduxie.go`) 12: //如果你文件在GOPath里面,可以用下面的路徑 13: //inputFile, err := os.Open("./wenjianduxie.go") 14: if err != nil { 15: fmt.Printf("err=%v\n", err) 16: return 17: } 18: defer func() { 19: err := inputFile.Close() 20: if err != nil { 21: fmt.Println("err1=", err) 22: } 23: }() 24: var buf [128]byte 25: var content []byte 26: for { 27: n, err := inputFile.Read(buf[:]) 28: if err == io.EOF { 29: // 代表文件讀完了 30: break 31: } 32: if err != nil { 33: fmt.Println("err=", err) 34: } 35: fmt.Println("length:", n) 36: // 將一個切片追加到另一個切片 37: content = append(content, buf[:n]...) 38: fmt.Println("data:\n", string(content)) 39: } 40: }

bufio原理

由于文件讀寫相對內存讀寫性能較差,所以在讀大文件時需要添加一層緩沖區,這就是bufio。
缺點:可能會丟失緩存的數據

1: func main() { 2: inputFile, err := os.Open("input.dat") 3: if err != nil { 4: fmt.Println("err=", err) 5: return 6: } 7: 8: defer inputFile.Close() 9: inputReader := bufio.NewReader(inputFile) 10: for { 11: // 以換行符為分隔,一行一行打印出來。 12: inputString, readerError :=inputReader.ReadString("\n") 13: if readerError == io.EOF { 14: return 15: } 16: fmt.Printf("The input was : %s", inputString) 17: } 18: }

ioutil直接讀取整個文件

1: func main() { 2: inputFile := "products.txt" 3: outputFile := "products_copy.txt" 4: buf, err := ioutil.ReadFile(inputFile) 5: if err != nil{ 6: fmt.Fprintf(os.Stderr, "File Error:%s\n", err) 7: return 8: } 9: fmt.Printf("%s\n", string(buf)) 10: }

讀取gzip壓縮文件

1: func main() { 2: zipfile := "Myfile.gz" 3: //open里面也可以寫路徑 4: fi, err1 := os.Open(zipfile) 5: if err1 != nil { 6: fmt.Fprintf(os.Stderr, "File Error:%s\n", err1) 7: os.Exit(1) 8: } 9: fz, err2 := gzip.NewReader(fi) 10: if err2 != nil { 11: fmt.Fprintf(os.Stderr,"File Error:%s\n", err2) 12: return 13: } 14: var r *bufio.Reader 15: r = bufio.NewReader(fz) 16: for { 17: line, err := r.ReadString('\n') 18: if err != nil { 19: fmt.Println(“Done reading file”) 20: os.Exit(0) 21: } 22: fmt.Println(line) 23: } 24: }

2.文件寫入

os.OpenFile("文件名",文件打開模式,權限控制)
文件打開模式:
1. os.O_WRONLY 只寫
2. os.O_CREATE 創建文件
3. os.O_RDONLY 只讀
4. os.O_RDWR? 讀寫
5. os.O_TRUNC 清空
6. OS.O_APPEND 追加
ps:可以這樣寫: os.O_WRONLY|os.O_CREATE,順序從左到右
權限控制:
r --> 004
w --> 002
x –> 001

api

1: file.Write() 2: file.WriteAt() 3: file.WriteString()

bufio文件寫入緩存區

1: writer := bufio.NewWriter() // 開辟緩存區 2: writer.WriteString() // 寫入緩存區 3: writer.Flush() // 刷新,從緩存區寫入文件

ioutil寫入整個文件

1: inputFile := "舊文件" 2: outputFile := "寫入的新文件" 3: buf, err := ioutil.ReadFile(inputFile) 4: err = ioutil.WriteFile(outputFile, buf, 0x644)

3.defer原理圖示

執行順序從上到下

???????????????? {返回值=x}
return x --
???????????????? {RET指令}

?????????????????? {返回值=x}???
defer原理 -- {運行defer語句}
?????????????????? {RET指令}

轉載于:https://www.cnblogs.com/haoqirui/p/10223916.html

總結

以上是生活随笔為你收集整理的Go语言学习笔记(十八)之文件读写的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。