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。
缺點:可能會丟失緩存的數據
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语言学习笔记(十八)之文件读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python爬虫入门教程 18-100
- 下一篇: Spark1.x和2.x如何读取和写入c