前言
Go语言的文件读写学习笔记
引入模块
1 2 3 4 5
| import ( os io bufio )
|
打开文件
<file>:文件路径,如果文件不存在会报错
1
| file, err := os.Open("<file>")
|
打开方式和权限控制
<file>:文件路径,如果文件不存在会报错
<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("<file>", <mode>, <jurisdiction>)
|
打开多种模式
<mode>:多种模式通过|分隔
1
| file, err := os.OpenFile("<file>", <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()已经被封装
<file>:文件路径
1 2
| all, err := ioutil.ReadFile("<file>") fmt.Println(string(all))
|
写文件
通过io包写字节
<str>:字符串
1
| file.Write([]byte("<str>"))
|
1
| file.WriteString("<str>")
|
通过bufio包写字符
追加写入
<file>:文件路径
<str>:字符串
\r\n:Windows系统下需要通过\r\n定义换行符
\n:类Unix系统下只需要通过\n定义换行符
1 2 3 4 5
| file, err := os.OpenFile("<file>", os.O_CREATE | os.WRONLY | o.APPEND, 0766) defer file.Close() writer := bufio.NewWriter(file) writer.WriterString("<str>\r\n") writer.Flush()
|
覆盖写入
<file>:文件路径
<str>:字符串
1 2 3 4 5
| file, err := os.OpenFile("<file>", os.O_CREATE | os.WRONLY | o.TRUNC, 0766) defer file.Close() writer := bufio.NewWriter(file) writer.WriterString("<str>\r\n") writer.Flush()
|
通过ioutil写入字符
- 每次写入都会覆盖原文件内容
- ioutil的写入没有追加写入的方式
<file>:文件路径
<str>:字符串
1
| err := ioutil.WriteFile("<file>", []byte("<str>"), 0766)
|
完成
参考文献
哔哩哔哩——尚硅谷
哔哩哔哩——筱筱知晓
知乎——linyb