Golang文件操作-上篇
目錄
1、讀文件
2、寫(xiě)文件
3、文件指針
4、ioutil文件操作
4.1 readall讀取文件所有內(nèi)容
4.2 readfile直接讀文件
4.3 writefile直接寫(xiě)文件
5、bufio帶緩沖IO
5.1 scanner 逐行讀取
5.2 帶緩沖IO reader
5.3 帶緩沖IO writer

1、讀文件
讀文件的過(guò)程
文件位置 打開(kāi)文件 讀取文件內(nèi)容(逐個(gè)字符讀、按批讀,只能按照字節(jié)切片讀) 關(guān)閉文件
文件路徑
絕對(duì)路徑:程序不管在什么位置運(yùn)行,打開(kāi)的文件都不會(huì)變化(從根路徑/盤(pán)符開(kāi)始書(shū)寫(xiě)的路徑) 相對(duì)路徑:與程序的位置有關(guān)(程序放置的位置、程序運(yùn)行的位置)
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、寫(xiě)文件
寫(xiě)文件的過(guò)程
創(chuàng)建文件 寫(xiě)入內(nèi)容(可以寫(xiě)字符串或字節(jié)切片) 關(guān)閉文件
示例,文件寫(xiě)入
package main
import (
"fmt"
"os"
)
func main() {
path := "user2.txt"
file, err := os.Create(path)
if err != nil {
fmt.Println(err)
} else {
// 寫(xiě)文件,會(huì)把原來(lái)的內(nèi)容清空再寫(xiě)
file.Write([]byte("abc123!@#"))
file.WriteString("xyz")
// 關(guān)閉文件
file.Close()
}
}
修改文件的過(guò)程
追加
OpenFile的常用幾種模式
os.O_WRONLY | os.O_CREATE | O_EXCL 【如果已經(jīng)存在,則失敗】
os.O_WRONLY | os.O_CREATE 【如果已經(jīng)存在,會(huì)覆蓋寫(xiě),不會(huì)清空原來(lái)的文件,而是從頭直接覆蓋寫(xiě)】
os.O_WRONLY | os.O_CREATE | os.O_APPEND 【如果已經(jīng)存在,則在尾部添加寫(xiě)】
語(yǔ)法
func OpenFile(name string, flag int, perm FileMode) (*File, error)
該方法第一個(gè)參數(shù)為文件路徑,第二個(gè)參數(shù)控制文件的打開(kāi)方式,第三個(gè)參數(shù)控制文件模式
示例,文件追加
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) // 如果已經(jīng)存在,則在尾部添加寫(xiě)
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) // 如果已經(jīng)存在,則在尾部添加寫(xiě)
if err == nil {
log.SetOutput(file)
log.SetPrefix("users: ")
log.SetFlags(log.Flags() | log.Lshortfile)
log.Print(time.Now().Unix())
file.Close()
}
}
最終的文件內(nèi)容效果
users: 2021/08/19 00:48:20 log.go:16: 1629388100
users: 2021/08/19 00:48:32 log.go:16: 1629388112
3、文件指針
主要是利用seek修改光標(biāo)位置,用的較少
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]))
// 偏移量,相對(duì)位置
// 文件開(kāi)始 0 os.SEEK_SET
// 當(dāng)前位置 1 os.SEEK_CUR
// 文件末尾 2 os.SEEK_END
fmt.Println(file.Seek(0, 0)) // 偏移量、相對(duì)位置
fmt.Println(file.Seek(0, 1)) // 查看當(dāng)前偏移量
fmt.Println(file.Seek(0, 2)) // 將指針?lè)诺轿募┪?/span>
n, err := file.Read(bytes)
fmt.Println(n, err, string(bytes[:n]))
file.Close()
}
4、ioutil文件操作
4.1 readall讀取文件所有內(nèi)容
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直接寫(xiě)文件
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 讀
對(duì)文件的"\n"進(jìn)行截?cái)?/p>
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 ~
加群方式:公眾號(hào)消息私信“加群”或加我好友再加群均可
評(píng)論
圖片
表情
