【笔记】Go语言的文件读写

前言

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操作系统下有效

07770表示8进制,777分别表示所属主、所属组、其他的读(4)、写(2)、可执行(1)权限

1
file, err := os.OpenFile("<src>", <mode>, <jurisdiction>)

打开多种模式

<mode>:多种模式通过|分隔

1
file, err := os.OpenFile("<src>", <mode>|<mode>, <jurisdiction>)

关闭文件

1
err := file.close()

在函数执行结束之前再执行

1
defer file.Close()

读文件

通过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