go 文件操作

一、文件就是保存数据的一种形式。比如我们经常用到的,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() //将内存中的数据刷回到硬盘保存
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值