概述
文件,对我们并不陌生,文件是数据源(保存数据的地方)的一种,比如大家经常使用的 word 文档,txt 文件,excel 文件…都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音…
输入流和输出流
文件在程序中是以流的形式来操作的。
- 流:数据在数据源(文件)和程序(内存)之间经历的路径。
- 输入流:数据从数据源(文件)到程序(内存)的路径。
- 输出流:数据从程序(内存)到数据源(文件)的路径。
File 结构体
os.File 封装所有文件相关操作,File 是一个结构体。File 代表一个打开的文件对象。
type File struct {
// 内含隐藏或非导出字段
}
打开文件
func Open(name string) (file *File, err error)
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。
关闭文件
func (f *File) Close() error
Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。
读取文件
方式一:使用带缓冲区的方式
相关方法和函数:os.Open()
,file.Close()
,bufio.NewReader()
,reader.ReadString()
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// 打开文件
file, err := os.Open("D:/test.txt")
if err != nil {
fmt.Println("打开文件失败,err=", err)
return
}
// 当函数退出时,要及时的关闭 file 句柄,否则会有内存泄漏
defer file.Close()
// 创建一个 *Reader 是带缓冲的
reader := bufio.NewReader(file)
// 循环的读取文件的内容
for {
// 读到一个换行就结束
str, err := reader.ReadSlice('\n')
// 输出内容
fmt.Print(string(str))
// io.EOF 表示文件的末尾
if err == io.EOF {
break
}
}
fmt.Println("文件读取结束")
}
方式二:使用一次性读取的方式(这种方式适用于文件不大的情况)
相关方法和函数:ioutil.ReadFile()
package main
import (
"fmt"
"io/ioutil"
)
func main() {
// 这里没有显式的Open文件,因此也不需要显示的Close文件
// 因为文件的Open和Close被封装到 ReadFile 函数内部
content, err := ioutil.ReadFile("D:/test.txt")
if err != nil {
fmt.Println("打开文件失败,err=", err)
return
}
fmt.Println(string(content))
}
写入文件
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。
第二个参数:文件打开模式(可以组合)
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)
应用实例:创建一个新文件,写入内容 5 句 "hello,world!"
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
filePath := "D:/abc.txt"
// os.O_CREATE 如果不存在将创建一个新文件
file, err := os.