文件读取
关于文件的读取是有些话要说的,要知道我们在实际工作中读取配置文件,很少有把路径写死的!所以读取相对路径是我们常用的,但是读取相对路径一定要注意文件和执行的主函数的位置,这一点我们下面会说。
读取绝对路径
go
package main
import (
"fmt"
"os"
)
func main() {
// 读取绝对路径
content, err := os.ReadFile("E:\\GoSpace\\go_study\\1.txt")
if err != nil {
return
}
fmt.Println(string(content))
}
这里主函数和1.txt是放在同一目录下的
读取相对路径
go
package main
import (
"fmt"
"os"
)
func main() {
// 读取绝对路径
content, err := os.ReadFile("config/2.txt")
if err != nil {
fmt.Println("出错了")
return
}
fmt.Println(string(content))
}
这里主函数是和config在同一目录下,2.txt是在config里面

我使用的是golang,我们可以打开Terminal,然后我们换个执行路径
PS E:\GoSpace\go_study\config> go run ...\27.文件读取.go
出错了
分割读
go
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 读取绝对路径
//content, err := os.ReadFile("config/2.txt")
//if err != nil {
// fmt.Println("出错了")
// return
//}
//fmt.Println(string(content))
file, err := os.Open("config/2.txt")
if err != nil {
panic(err)
}
defer file.Close()
for {
bytes := make([]byte, 2)
n, err := file.Read(bytes)
if err == io.EOF {
break
}
fmt.Println(string(bytes[:n]))
}
}
按行读
go
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("config/2.txt")
if err != nil {
panic(err)
}
defer file.Close()
buf := bufio.NewReader(file)
for {
line, _, err := buf.ReadLine()
if err == io.EOF {
break
}
fmt.Println(string(line))
}
}
指定分隔符读
go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("config/2.txt")
if err != nil {
panic(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
//scanner.Split(bufio.ScanWords)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
文件写入
基本用法
第一种
go
package main
import "os"
func main() {
file, err := os.OpenFile("w.txt", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
panic(err)
}
defer file.Close()
file.Write([]byte("你好"))
}
第二种
go
package main
import "os"
func main() {
err := os.WriteFile("hello.txt", []byte("hello world"), 0777)
if err != nil {
panic(err)
}
}
效果如下:生成文件在执行的主函数同级目录下,在这里我反复强调的原因就是,本人之前跑过几个开源项目,全部都因为读取项目的配置文件启动失败,而我又没有看别人提过这个问题。说实话,Java的SpringBoot项目想出这种问题都很困难,我还是看项目的作者回复我,我才意识到这个问题!


关于读写权限
我们把刚才的代码从写改成读
go
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.OpenFile("w.txt", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
panic(err)
}
defer file.Close()
//file.Write([]byte("你好"))
reader, err := io.ReadAll(file)
if err != nil {
panic(err)
}
fmt.Println(string(reader))
}
控制打印报错:panic: read w.txt: Access is denied.
这里报错的原因是os.O_CREATE|os.O_WRONLY设置的权限不对,改成os.O_CREATE|os.O_RDONLY就可以正常执行了
文件复制
go
package main
import (
"io"
"os"
)
func main() {
file, err := os.Open("hello.txt")
if err != nil {
panic(err)
}
defer file.Close()
file1, err := os.OpenFile("hello1.txt", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
panic(err)
}
defer file1.Close()
io.Copy(file1, file)
}
效果:

目录拷贝
go
package main
import (
"fmt"
"os"
)
func main() {
dir, err := os.ReadDir("day1")
if err != nil {
return
}
for _, fi := range dir {
fmt.Println(fi.Info())
fmt.Println(fi.Name())
//if fi.IsDir() {
//}
}
}