Golang--文件操作
1、文件
文件:文件用于保存数据,是数据源的一种
os包下的File结构体封装了对文件的操作(记得包os包)
2、File结构体--打开文件和关闭文件
2.1 打开文件
打开文件,用于读取(函数):
传入一个字符串(文件的路径),返回的是文件的指针和是否打开成功error
2.2 关闭文件
关闭文件(方法):
使文件不能用于读写,它返回可能出现的错误package main import ( "fmt" "os" ) func main(){ //打开文件 file,err := os.Open("D:/Golang_Project/src/GoCode/test1_project/main/t.txt") if err != nil { //出错 fmt.Println("文件打开失败") return }else{ fmt.Printf("文件内容=%v\n",file) //文件内容=&{0xc0000a66c8} } //关闭文件--调用方法 err = file.Close() if err != nil{ fmt.Println("关闭失败") }else{ fmt.Println("关闭成功") } }
3、读取操作
IO流:用于程序和数据源之间进行沟通
方向:输入和输出(写入程序为输入,程序写出为输出,对应输入流和输出流)
一次性全部读取
读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中),这种方式适用于文件不大的情况。相关方法和函数(ioutil.ReadFile)(包:io/ioutil)
package main import ( "fmt" "os" "io/ioutil" ) func main(){ //打开文件 file,err := os.Open("D:/Golang_Project/src/GoCode/test1_project/main/t.txt") if err != nil { //出错 fmt.Println("文件打开失败") return }else{ //其实不需要进行Open和Close,因为ioutil.ReadFile()会自动打开和关闭文件 content,errRead := ioutil.ReadFile("D:/Golang_Project/src/GoCode/test1_project/main/t.txt") //返回类型是[]byte和error if errRead!= nil{ fmt.Println("文件读取失败") }else{ fmt.Printf("文件内容=%s\n",string(content)) //文件内容=hello world } } //关闭文件--调用方法 err = file.Close() if err != nil{ fmt.Println("关闭失败") }else{ fmt.Println("关闭成功") } }
带缓冲区的读取
读取文件的内容并显示在终端(带缓冲区的方式--4096字节),适合读取比较大的文件,使用os.Open,file.Close,bufio.NewReader(),reader.ReadString函数和方法package main import ( "fmt" "os" "bufio" "io" ) func main(){ //打开文件: file,err := os.Open("D:/Golang_Project/src/GoCode/test1_project/main/t.txt") //关闭文件--defer defer file.Close() //判断文件是否打开成功 if err!= nil{ fmt.Println("文件打开失败") return }else{ //创建一个流 reader := bufio.NewReader(file) //读取文件 for{ //循环读取文件 str,errRead := reader.ReadString('\n')//以换行符为单位读取文件 fmt.Println(str) if errRead == io.EOF{ //io.EOF表示已经读取到文件末尾 break } } } }
4、写入文件
参数含义:
- name:要打开的路径
- flag:文件打开模式(可以利用"|"符号进行组合)
- perm:权限控制(linux/unix系统下才生效,windows下设置无效)-0666(-rw-rw-rw-)
package main import ( "fmt" "os" "bufio" ) func main(){ //写入文件 //打开文件 file,err := os.OpenFile("D:/Golang_Project/src/GoCode/test1_project/main/t.txt",os.O_CREATE|os.O_WRONLY,0666) //关闭文件--defer defer file.Close() //判断文件是否打开成功 if err!= nil{ fmt.Println("文件打开失败") return }else{ //写入文件操作:io流 -> 缓冲输出流(带缓冲区) write := bufio.NewWriter(file) write.WriteString("hello world\n") //刷新缓冲区---> 才会将缓冲区的内容写入到文件中 write.Flush() } }
5、文件复制
文件复制 f1 - > f2:
- 读取f1文件
- 写入f2文件
package main import ( "fmt" "io/ioutil" ) func main(){ //定义源文件 file1Path := "D:/Golang_Project/src/GoCode/test1_project/main/t.txt" //定义目标文件 file2Path := "D:/Golang_Project/src/GoCode/test1_project/main/t1.txt" //对文件进行读取: content,err1 := ioutil.ReadFile(file1Path) if err1!= nil{ fmt.Println("文件读取失败") return } //对文件进行写入: err2 := ioutil.WriteFile(file2Path,content,0666) if err2!= nil{ fmt.Println("文件写入失败") return }