一、文件就是保存数据的一种形式。比如我们经常用到的,word文档、txt文本文档、excel文件都是用来保存数据的。当然文件也可以是一张图片、一段音频、一个小电影.....总之它就是用来保存数据的。
二、输出流和输入流,因为文件在程序中是以流的形式来操作的
流:数据在数据源文件和程序(内存)之间流动所经历的路径
输入流:数据从文件流动到程序内存的路径。(将硬盘里的数据提取到内存中)
输出流:数据从程序内存到数据源文件的路径。(将内存中的数据刷回到硬盘存储)
三、go中对文件操作的包os.File,封装了所有文件数据相关的操作方法,
注意:File是一个结构体,f 代表的是一个打开的文件实例,os.File绑定的所有方法是对打开的文件数据进行操作。 os.File不涉及创建和打开文件的操作。
四、os包中封装了打开文件和创建文件的相关函数。
从Create(),Open(),OpenFile()...函数中可以看到返回的数据都有 *File(File结构体指针)
五、带缓冲区的读取文件数据
所谓的带缓冲就是,将文件数据(硬盘数据)根据需要分多次一部分一部分读取到内存中。
为什么要这样做?因为当一个文件得数据非常大,我们一次性读取到内存中,就有可能将内存撑满或者占了大量内存,影响运行性能。
golang bufio包提供了相关方法创建缓冲区 Reader对象
要注意的是os.Open()打开的文件是用于读的,如果要修改文件内容则不行
一次性将文件内容读取到内存中(没有缓冲),这个只适合于读取比较小的文件。 ioutil.ReadFile()
六、创建文件并写入内容
os包提供了os.OpenFile()方法
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
参数1:name带文件名的路径(相对路径和绝对路径)
参数2:flag文件的操作模式(模式还可以组合使用,用 “|”符号来隔开),我们需要创建一个文件并写入数据,那么就 O_WRONLY 和 O_CREATE组合
参数3:文件的操作权限,在linux或unix系统下有作用,win系统没有作用
r:读权限 权限值4
w:写权限 权限值2
x:执行权限 权限值1
6 代表 有读和写权限 7代表有读写和执行权限
0666 代表 第二位数是指拥有者的权限 ,第三位是所属组的权限,第四位是其他用户的权限
具体去参考linux文件权限操作章节
案列,创建文件并写入内容:
注意:带缓冲的写,首先写入的数据是在内存中的,需要调用方法刷回硬盘的
writer.Flush() ,同时文件操作完后需要关闭文件
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
str := "./test.txt" //要创建的文件,相对路径
//以只写和创建模式打开一个不存在的文件
file,err := os.OpenFile(str,os.O_WRONLY|os.O_CREATE,0666)
if err != nil {
fmt.Println("打开文件失败")
}
defer file.Close() //函数执行完最后关闭文件
//创建一个写缓冲区 Writer
writer:=bufio.NewWriter(file)
//连续写入多行数据
str = "我爱中华人民共和国\r\n" //带换行符
for i := 0; i < 5; i++ {
writer.WriteString(str) //写入字符串
}
//如上的操作还是在缓冲区中写数据,数据还在内存中
writer.Flush() //将内存中的数据刷回到硬盘保存
}
执行结果
案例:打开一个已存在的文件,清除文件中的内容
os.O_WRONLY|os.O_TRUNC
,重写入数据(还是用之前的代码,更改下模式和写入的数据)
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
str := "./test.txt" //要创建的文件,相对路径
//以只写和创建模式打开一个不存在的文件
file,err := os.OpenFile(str,os.O_WRONLY|os.O_TRUNC,0666)
if err != nil {
fmt.Println("打开文件失败")
}
defer file.Close()
//创建一个写缓冲区 Writer
writer:=bufio.NewWriter(file)
//连续写入多行数据
str = "拥护共产党的领导\r\n" //带换行符
for i := 0; i < 10; i++ {
writer.WriteString(str) //写入字符串
}
//如上的操作还是在缓冲区中写数据,数据还在内存中
writer.Flush() //将内存中的数据刷回到硬盘保存
}
执行结果:
案列:打开一个已存在的文件,在文件已有的内容后追加新的内容
os.O_WRONLY|os.O_APPEND
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
str := "./test.txt" //要创建的文件,相对路径
//以只写和创建模式打开一个不存在的文件
file,err := os.OpenFile(str,os.O_WRONLY|os.O_APPEND,0666)
if err != nil {
fmt.Println("打开文件失败")
}
defer file.Close()
//创建一个写缓冲区 Writer
writer:=bufio.NewWriter(file)
//连续写入多行数据
str = "北国风光,千里冰封,万里雪飘。\r\n" //带换行符
for i := 0; i < 10; i++ {
writer.WriteString(str) //写入字符串
}
//如上的操作还是在缓冲区中写数据,数据还在内存中
writer.Flush() //将内存中的数据刷回到硬盘保存
}
执行结果:
案例:打开一个已存在的文件,读取数据到终端显示,并再追加几行内容到文件中
os.O_RDWR|os.O_APPEND
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
str := "./test.txt" //要创建的文件,相对路径
//以只写和创建模式打开一个不存在的文件
file,err := os.OpenFile(str,os.O_RDWR|os.O_APPEND,0666)
if err != nil {
fmt.Println("打开文件失败")
}
defer file.Close()
//创建一个读的缓冲区reader
reader := bufio.NewReader(file)
for {
s,err1 := reader.ReadString('\n') //读取一行\
if err1 == io.EOF { //读取到文件的末尾
break
}
fmt.Println(s)
}
//创建一个写缓冲区 Writer
writer:=bufio.NewWriter(file)
//连续写入多行数据
str = "我和我爱的祖国。。。。。。。。。\r\n" //带换行符
for i := 0; i < 3; i++ {
writer.WriteString(str) //写入字符串
}
//如上的操作还是在缓冲区中写数据,数据还在内存中
writer.Flush() //将内存中的数据刷回到硬盘保存
}