go语言—文件操作

计算机中的文件是存储在外部介质(通常为磁盘)上的数据集合,文件分为文本文件和二进制文件

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
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值