【笔记】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操作系统下有效

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

关闭文件

1
err := file.close()

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

1
defer file.close()

读文件(带缓冲区的Reader)

创建一个Reader

  • Reader缓冲大小默认为4096Byte
1
2
3
4
5
6
7
8
9
10
11
12
// 创建文件输入流对象
reader := bufio.NewReader(file)
// 循环读取文件内容
for {
// 每次读到换行符时,就结束一次文件读取
line, err := reader.ReaderString('\n')
// 读到io.EOF表示读到文件结束
if err == io.EOF {
break
}
fmt.Print(line)
}

读文件(不带缓冲区一次性读取全部文件)

  • 适合读取小文件
  • 返回一个[]byte
  • 因为ioutil.ReadFile()没有显式的Open()打开文件,所以也不需要显式的Close()关闭文件,因为Close()已经被封装
1
2
content, err := ioutil.ReadFile("<src>")
fmt.Println(string(content))

写文件(带缓冲区的Writer)

\r\n:Windows系统下需要通过\r\n定义换行符
\n:类Unix系统下只需要通过\n定义换行符

如果没有文件就创建新文件

1
2
3
4
5
6
7
8
9
// 写入模式,如果没有文件就创建新文件
file, err := os.open("<src>", os.O_WRONLY | os.O_CREATE, 0766)

// 创建文件输出流对象
writer := bufio.NewWriter(file)
// 在缓冲区中写入字符串
writer.WriterString("写入字符串\r\n")
// 将缓冲区的数据写入到文件中
writer.Flush()

写入之前清空文件内容

1
2
3
4
5
6
7
8
9
// 写入模式,写入之前清空文件内容
file, err := os.open("<src>", os.O_WRONLY | os.O_TRUNC, 0766)

// 创建文件输出流对象
writer := bufio.NewWriter(file)
// 在缓冲区中写入字符串
writer.WriterString("写入字符串\r\n")
// 将缓冲区的数据写入到文件中
writer.Flush()

追加写入

1
2
3
4
5
6
7
8
9
// 写入模式,追加写入
file, err := os.open("<src>", os.O_WRONLY | os.O_APPEND, 0766)

// 创建文件输出流对象
writer := bufio.NewWriter(file)
// 在缓冲区中写入字符串
writer.WriterString("写入字符串\r\n")
// 将缓冲区的数据写入到文件中
writer.Flush()

完成

参考文献

哔哩哔哩——尚硅谷