go -- 文件操作(1)读与写

go – 文件操作(1)读与写

​ 众所周知,文件是数据源(数据保存的地方),常见类型的文件大家其实都不陌生

​ 很显然文件是以流的形式来操作的

//流:数据在文件和程序之间经历的路径

//输入流:数据从文件到程序的路径

//输出流:数据从程序到文件的路径

在打开和关闭文件,我们一般使用os模块下的函数,直接贴一段官方函数解释

在这里插入图片描述

一般是使用Open来调用一个文件,但是OpenFile可以制定一些参数

const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件,也就是将文件覆盖
)

比如说flag就可以指定这一些,之后我们会举例的

关于读的操作

读的操作分为一次性读取和缓冲式读取

首先来介绍一下一次性读取,一次性读取并不需要os模块下的open,而是直接通过string读取文件的名字,并且返回一个[]byte类型,很显然这种方式并不适合大文件的读取,十分的占空间

在这里插入图片描述

package main
import (
	"fmt"
    "io/ioutil"
)
func main(){
	file := "./test.txt"  //读取当前目录下的一个文件
	content,err := ioutil.ReadFile(file)
	if err !=nil{
		fmt.Println("\n文件读取结束")
	}
	fmt.Printf("%v",string(content))

}

接下来介绍一下缓冲式读取文件

缓冲式读取需要通过bufio这一个模块
在这里插入图片描述

package main
import (
	"fmt"
	"os"
	"bufio"
	"io"
)
//---------------------------缓冲读取------------------------
func main(){
	file , err  := os.Open("test.txt")
	if err != nil{
		fmt.Println("open file err=",err)
	}
	defer file.Close()  
	//当函数退出时,要及时的关闭file,否则会有内存泄漏

	//创建一个 *Reader ,是带有缓冲的

	/*
	const(
		defaultBufSize = 4096  //默认缓冲区为4096 
	)
	这种方式一般用于读取大文件,分多次提取
	*/
	reader := bufio.NewReader(file)
	//循环的读取文件的内容

	for {
		str,err := reader.ReadString('\n')
		fmt.Print(str)
		if err == io.EOF{  //io.EOF表示文件的末尾
			fmt.Println("\n文件读取结束...")
			break
		}
	}
}
关于写的操作

写的操作如果是也是缓冲类型的话,那么同样也是需要先os来调用打开文件,指定写的权限操作,然后使用bufio模块进行写

在这里插入图片描述

const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件,也就是将文件覆盖
)
package main
import(
	"fmt"
	"bufio"
	"os"
)
func main(){
	f_path := "./abc.txt"
	file,err := os.OpenFile(f_path, os.O_WRONLY|os.O_CREATE, 0666) //这一类的参数查看官方文档,windows下0666没反应 
	if err != nil{
		fmt.Printf("open file err=%v\n",err)
		return
	}
	defer file.Close()
	str := "hello,duan\n" //在某些版本过低的系统,换行需要添加\r这样的符号来识别\n     str := "hello,duan\r\n" ,至少在win10就不用添加这个
	write := bufio.NewWriter(file)  //写入的时候其实是具有一个缓存的,需要使用一个Flush方法来将缓冲的数据真正写入文件,否则会丢失
	for i:=0;i<5;i++{
		write.WriteString(str)
	}
	write.Flush()  //注意的是写了之后一定一定要Flush一下
}
er(file)  //写入的时候其实是具有一个缓存的,需要使用一个Flush方法来将缓冲的数据真正写入文件,否则会丢失
	for i:=0;i<5;i++{
		write.WriteString(str)
	}
	write.Flush()  //注意的是写了之后一定一定要Flush一下
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无言无语的星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值