计算机中的文件是存储在外部介质(通常为磁盘)上的数据集合,文件分为文本文件和二进制文件
1、打开和关闭文件
- os.open()函数能够打开一个文件,返回*File和err
- close()关闭文件
func main(){
//打开当前目录day05下的day05.go
file,err := os.Open("./day05/day05.go")
if err != nil{
fmt.Println("文件打开失败,err:",err)
return
}
//关闭文件
file.Close()
}
为了防止文件关闭,通常使用defer注册文件关闭语句
2、读取文件
func (f *File) Read(b []byte) (n int, err error)
只接收一个字节切片,返回读取的字节数和可能出现的错误,读到文件末尾时会返回0和io.EOF
func main(){
//只读方式打开当前目录下的main.go文件
file,err := os.Open("./main.go")
if err != nil{
fmt.Println("文件读取失败,err:",err)
return
}
//关闭文件
defer file.Close()
//读取文件数据
var temp = make([]byte,128) //定义一个长度为128的切片
n,err := file.Read(temp)
if err == io.EOF{
fmt.Println("文件读完了")
return
}
if err != nil{
fmt.Println("读取数据失败:err:",err)
return
}
fmt.Printf("读取了%d字节数据\n",n)
fmt.Println(string(temp[:n])) //只能读取128字节的数据,超出的读不出
}
3、循环读取
用for循环读取文件中的所有数据
func main(){
//打开当前目录下的main.go文件
file,err := os.Open("./main.go")
if err != nil{
fmt.Println("文件打开失败,err:",err)
return
}
defer file.Close()
//循环读取文件
var content []byte //声明一个content切片,将循环读取的数据都添加进来
temp := make([]byte,128) //定义一个长度为128的切片temp,用于接收每次循环读取的部分数据
for{
n,err := file.Read(temp)
if err == io.EOF{
fmt.Println("文件读取完成")
break
}
if err != nil{
fmt.Println("文件读取错误,err:",err)
return
}
//循环中将每次读取的部分内容切片添加到content
content = append(content,temp[:n]...)
}
fmt.Println(string(content))
}
4、bufio读取文件
bufio 提供了一些缓冲的操作,在从硬盘中读取字节前使用内存缓存,如果对文件 I/O 操作比较频繁的,使用 bufio 包能够提高一定的性能
func main(){
file,err := os.Open("./main.go")
if err != nil{
fmt.Println("文件打开失败,err:",err)
return
}
defer file.Close()
//将文件内容读入缓存
reader := bufio.NewReader(file)
//循环的一行行读取全部数据
for{
line,err := reader.ReadString('\n') //以换行符为结束读完一行
if err == io.EOF{
fmt.Println("文件读完了")
break
}
if err != nil{
fmt.println("文件读取失败,err:",err)
return
}
fmt.Println(line)
}
}
5、读取整个文件
os包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入
func main(){
content,err := os.ReadFile("./main.go")
if err != nil{
fmt.Println("文件读取失败,err:",err)
return
}
fmt.Println(string(content))
}
6、文件写入操作
os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
name:要打开的文件名 flag:打开文件的模式。 模式有以下几种:
- os.O_APPEND:当向文件中写入内容时,把新内容追加到现有内容的后边。
- os.O_CREATE:当给定路径上的文件不存在时,创建一个新文件。
- os.O_EXCL:需要与os.O_CREATE一同使用,表示在给定的路径上不能有已存在的文件。
- os.O_SYNC:在打开的文件之上实施同步 I/O。它会保证读写的内容总会与硬盘上的数据保持同步。
- os.O_TRUNC:如果文件已存在,并且是常规的文件,那么就先清空其中已经存在的任何内容。
perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01
6.1、Write和WriteString
func main(){
//如果当前目录下不存在xx.txt文件就创建一个并写入,如果存在就清空内容再写入
file,err := os.OpenFile("./xx.txt",os.O_CREATE|os.O_TRUNC|os.O_WRONLY,0666)
if err != nil{
fmt.Println("文件打开失败。err:",err)
return
}
defer file.Close()
//写入的内容
str := "hello你好吗"
file.Write([]byte(str)) //以切片形式写入
file.WriteString("我很不好") //直接写入字符串
}
6.2、bufio.NewWriter
func main(){
file,err := os.OpenFile("./dd.txt",os.O_CREATE|os.O_TRUNC|os.O_WRONLY,0666)
if err != nil{
fmt.Println("文件打开失败。err:",err)
return
}
defer file.Close()
//将数据写到缓存区
writer := bufio.NewWriter(file)
writer.WriteString("今天星期几")
//将缓存内容写到文件
writer.Flush()
}
6.3、WriteFile
func main(){
str := "今天周五了"
err := os.WriteFile("ss.txt",[]byte(str),0666)
if err != nil{
fmt.Println("文件写入失败。err:",err)
return
}
}