前言
Go语言的文件读写学习笔记
引入模块
1 2 3 4 5
| import ( os io bufio )
|
打开文件
<src>
:文件路径,如果文件不存在会报错
1
| file, err := os.Open("<src>")
|
打开方式和权限控制
<src>
:文件路径,如果文件不存在会报错
<mode>
:打开的模式,多种模式同时指定时可以使用|
隔开
os.O_RDONLY
:只读模式打开文件
os.O_WRONLY
:只写模式打开文件
os.O_RDWR
:读写模式打开文件
os.O_APPEND
:追加写入
os.O_CREATE
:如果文件不存在就创建一个新文件
os.O_EXCL
:文件不存在就会报错
os.O_SYNC
:打开文件用于异步I/O
os.O_TRLNC
:打开文件时立即清空文件内容
<jurisdiction>
:权限控制,只在类Unix操作系统下有效
0777
:0
表示8进制,777
分别表示所属主、所属组、其他的读(4)、写(2)、可执行(1)权限
1
| file, err := os.OpenFile("<src>", <mode>, <jurisdiction>)
|
打开多种模式
<mode>
:多种模式通过|
分隔
1
| file, err := os.OpenFile("<src>", <mode>|<mode>, <jurisdiction>)
|
关闭文件
在函数执行结束之前再执行
读文件
通过io包读字节
buf
:每次读取文件的字节
num
:读取字节的长度
1 2 3
| var buf = make([]byte, 1024) num, err := file.Read(buf) res := string(buf)
|
循环读取所有文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13
| var all = make([]byte, 0) var buf = make([]byte, 1024)
for { num, err := file.Read(buf) if err == io.EOF { break } all = append(all, buf[:num]...) }
res := string(all)
|
通过bufio包读字符
每次读取一行的内容
- 通过带缓冲区的Reader实现一次读取一行
- Reader缓冲大小默认为4096Byte
1 2 3 4 5 6 7 8 9 10 11 12 13
| var all string reader := bufio.NewReader(file)
for { line, err := reader.ReadString('\n') if err == io.EOF { break } all += line }
res := string(all)
|
通过ioutil包读字符
一次读取全部文件内容
- 通过不带缓冲区的Reader实现一次读取整个文件
- 适合读取小文件
- 返回一个
[]byte
- 因为
ioutil.ReadFile()
没有显式的Open()
打开文件,所以也不需要显式的Close()
关闭文件,因为Close()
已经被封装
<src>
:文件路径
1 2
| all, err := ioutil.ReadFile("<src>") fmt.Println(string(all))
|
写文件
通过io包写字节
<str>
:字符串
1
| file.Write([]byte("<str>"))
|
1
| file.WriteString("<str>")
|
通过bufio包写字符
追加写入
<src>
:文件路径
<str>
:字符串
\r\n
:Windows系统下需要通过\r\n
定义换行符
\n
:类Unix系统下只需要通过\n
定义换行符
1 2 3 4 5
| file, err := os.OpenFile("<src>", os.O_CREATE | os.WRONLY | o.APPEND, 0766) defer file.Close() writer := bufio.NewWriter(file) writer.WriterString("<str>\r\n") writer.Flush()
|
覆盖写入
<src>
:文件路径
<str>
:字符串
1 2 3 4 5
| file, err := os.OpenFile("<src>", os.O_CREATE | os.WRONLY | o.TRUNC, 0766) defer file.Close() writer := bufio.NewWriter(file) writer.WriterString("<str>\r\n") writer.Flush()
|
通过ioutil写入字符
- 每次写入都会覆盖原文件内容
- ioutil的写入没有追加写入的方式
<src>
:文件路径
<str>
:字符串
1
| err := ioutil.WriteFile("<src>", []byte("<str>"), 0766)
|
完成
参考文献
哔哩哔哩——尚硅谷
哔哩哔哩——筱筱知晓
知乎——linyb