Golang 文件操作 - 上篇
目錄
-
1、讀文件
-
2、寫文件
-
3、文件指針
-
4、ioutil 文件操作
-
4.1 readall 讀取文件所有內容
-
4.2 readfile 直接讀文件
-
4.3 writefile 直接寫文件
-
5、bufio 帶緩衝 IO
-
5.1 scanner 逐行讀取
-
5.2 帶緩衝 IO reader
-
5.3 帶緩衝 IO writer
1、讀文件
讀文件的過程
-
文件位置
-
打開文件
-
讀取文件內容(逐個字符讀、按批讀,只能按照字節切片讀)
-
關閉文件
文件路徑
-
絕對路徑:程序不管在什麼位置運行,打開的文件都不會變化(從根路徑 / 盤符開始書寫的路徑)
-
相對路徑:與程序的位置有關(程序放置的位置、程序運行的位置)
package main
import (
"fmt"
"io"
"os"
)
func main() {
path := "user.txt"
file, err := os.Open(path)
if err != nil {
fmt.Println(err)
} else {
//fmt.Println(file) // &{0xc0000b2120} *os.File指針類型
//var bytes []byte = make([]byte, 20)
//n, err := file.Read(bytes)
//fmt.Println(n ,err)
//fmt.Println(string(bytes[:n]))
bytes := make([]byte, 20)
for {
n, err := file.Read(bytes)
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
} else {
fmt.Print(string(bytes[:n]))
}
}
file.Close()
}
}
2、寫文件
寫文件的過程
-
創建文件
-
寫入內容(可以寫字符串或字節切片)
-
關閉文件
示例,文件寫入
package main
import (
"fmt"
"os"
)
func main() {
path := "user2.txt"
file, err := os.Create(path)
if err != nil {
fmt.Println(err)
} else {
// 寫文件,會把原來的內容清空再寫
file.Write([]byte("abc123!@#"))
file.WriteString("xyz")
// 關閉文件
file.Close()
}
}
修改文件的過程
- 追加
OpenFile 的常用幾種模式
os.O_WRONLY | os.O_CREATE | O_EXCL 【如果已經存在,則失敗】
os.O_WRONLY | os.O_CREATE 【如果已經存在,會覆蓋寫,不會清空原來的文件,而是從頭直接覆蓋寫】
os.O_WRONLY | os.O_CREATE | os.O_APPEND 【如果已經存在,則在尾部添加寫】
語法
func OpenFile(name string, flag int, perm FileMode) (*File, error)
該方法第一個參數爲文件路徑,第二個參數控制文件的打開方式,第三個參數控制文件模式
示例,文件追加
package main
import (
"os"
"strconv"
"time"
)
func main() {
path := "user.log"
file, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, os.ModePerm) // 如果已經存在,則在尾部添加寫
if err == nil {
file.WriteString(strconv.FormatInt(time.Now().Unix(), 10))
file.WriteString("\n")
file.Close()
}
}
將日誌記錄到文件
package main
import (
"log"
"os"
"time"
)
func main() {
path := "user.log"
file, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, os.ModePerm) // 如果已經存在,則在尾部添加寫
if err == nil {
log.SetOutput(file)
log.SetPrefix("users: ")
log.SetFlags(log.Flags() | log.Lshortfile)
log.Print(time.Now().Unix())
file.Close()
}
}
最終的文件內容效果
users: 2021/08/19 00:48:20 log.go:16: 1629388100
users: 2021/08/19 00:48:32 log.go:16: 1629388112
3、文件指針
主要是利用seek
修改光標位置,用的較少
package main
import (
"fmt"
"os"
)
func main() {
file , _ := os.Open("user.txt")
bytes := make([]byte, 100)
n, _ := file.Read(bytes)
fmt.Println(n, string(bytes[:n]))
// 偏移量,相對位置
// 文件開始 0 os.SEEK_SET
// 當前位置 1 os.SEEK_CUR
// 文件末尾 2 os.SEEK_END
fmt.Println(file.Seek(0, 0)) // 偏移量、相對位置
fmt.Println(file.Seek(0, 1)) // 查看當前偏移量
fmt.Println(file.Seek(0, 2)) // 將指針放到文件末尾
n, err := file.Read(bytes)
fmt.Println(n, err, string(bytes[:n]))
file.Close()
}
4、ioutil 文件操作
4.1 readall 讀取文件所有內容
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
path := "user.txt"
file, err := os.Open(path)
if err != nil {
fmt.Println(err)
} else {
defer file.Close()
bytes, err := ioutil.ReadAll(file)
fmt.Println(string(bytes), err)
}
}
4.2 readfile 直接讀文件
package main
import (
"fmt"
"io/ioutil"
)
func main() {
bytes, err := ioutil.ReadFile("user.txt")
if err == nil {
fmt.Println(string(bytes))
}
}
4.3 writefile 直接寫文件
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
err := ioutil.WriteFile("user.txt", []byte("xxxxxxxxxxxxxxxxxxxxx"), os.ModePerm)
fmt.Println(err)
}
5、bufio 帶緩衝 IO
文檔:https://pkg.go.dev/bufio
5.1 scanner 逐行讀取
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("user.txt")
if err == nil {
defer file.Close()
i := 0
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(i, scanner.Text())
i++
}
}
}
5.2 帶緩衝 IO reader
5.2.1 read 讀
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("user.txt")
if err == nil {
defer file.Close()
reader := bufio.NewReader(file)
bytes := make([]byte, 5)
for {
n , err := reader.Read(bytes)
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
} else {
fmt.Println(n, err, string(bytes))
}
}
}
}
5.2.2 readline 讀
對文件的 "\n" 進行截斷
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("user.txt")
if err == nil {
defer file.Close()
reader := bufio.NewReader(file)
for {
line, isPrefix, err := reader.ReadLine()
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
} else {
fmt.Println(isPrefix, err, string(line))
}
}
}
}
5.2.3 readstring、readslice 讀
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("user.txt")
if err == nil {
defer file.Close()
reader := bufio.NewReader(file)
for {
// line, err := reader.ReadSlice('\n')
line, err := reader.ReadString('\n')
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
} else {
// fmt.Println(err, string(line))
fmt.Println(err, line)
}
}
}
}
5.3 帶緩衝 IO writer
帶緩衝writer
示例
package main
import (
"bufio"
"os"
)
func main() {
file, err := os.Create("user.txt")
if err == nil {
defer file.Close()
writer := bufio.NewWriter(file)
writer.WriteString("abcdef")
writer.Write([]byte("123456"))
writer.Flush()
}
}
See you ~
仙人技術
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/8puWfJ8e7ncSd6sUPtxB1Q