• 【Go ~ 0到1 】 第六天 文件的读写与创建


    1. 文件的打开与关闭

    1.1 os.open

    os.open 函数能打开一个文件 调用 close() 方法 关闭文件

    	//打开文件
    	open, err := os.Open("./1.text")
    	
    	if err != nil {
    		//打印异常信息
    		fmt.Println("open file err", err)
    	}
    
    	fmt.Println("文件获取完毕")
    
    	//没有出现异常,关闭文件
    	open.Close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    为了防止忘记关闭文件,通常都将关闭文件的代码写在 defer中

    	//打开文件
    	open, err := os.Open("./1.text")
    
    	defer func() {
    		if open != nil {
    			// 关闭文件
    			open.Close()
    		}
    	}()
    
    	if err != nil {
    		//打印异常信息
    		fmt.Println("open file err", err)
    	}
    
    	fmt.Println("文件获取完毕")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.2 os.OpenFile() 指定模式打开文件

    func OpenFile(name string, flag int, perm FileMode) (*File, error) {
    	...
    }
    
    • 1
    • 2
    • 3

    其中:

    name:要打开的文件名 flag:打开文件的模式。 模式有以下几种:

    模式含义
    os.O_WRONLY只写
    os.O_CREATE创建文件
    os.O_RDONLY只读
    os.O_RDWR读写
    os.O_TRUNC清空
    os.O_APPEND追加

    perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。

    2. 文件的读取

    2.1 打开文件的方式读取文件中的数据

    //首先需要打开一个文件
    	open, err := os.Open("./1.text")
    	defer func() {
    		e := recover()
    		if e != nil {
    
    			fmt.Println("打开文件出现了异常", e)
    		}
    	}()
    
    	if err != nil {
    		// 如果有异常  没必要往下走了  抛出
    		panic(err)
    	}
    
    	//如果没有异常
    	//创建 字节切片
    	bytes := make([]byte, 1024)
    
    	defer func() {
    		e := recover()
    		if e != nil {
    
    			fmt.Println("读取文件出现了异常", e)
    		}
    	}()
    
    	for {
    		//循环读
    		_, err := open.Read(bytes)
    
    		if err != nil {
    			panic(err)
    		}
    
    		//打印结果
    		fmt.Println(string(bytes))
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    2.2 使用 bufio 整行读取文件

    bufio 是在file的基础上封装了一层API , 支持更多的功能

    	//同样的首先打开一个文件
    	file, err := os.Open("./1.text")
    
    	defer recover()
    
    	if err != nil {
    		panic("文件打开出现异常")
    	}
    
    	// 封装为 bufio
    	reader := bufio.NewReader(file)
    
    	defer recover()
    
    	for {
    
    		//读到指定字符串换一行
    		line, _, err := reader.ReadLine()
    
    		if err != nil {
    			if err == io.EOF {
    				fmt.Println("文件读写完毕")
    				break
    			}
    			panic("文件读取出现异常")
    		}
    
    		fmt.Println(string(line))
    	}
    
    	fmt.Println("程序运行结束")
    func main() {
    	file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    2.3 ioutil 一次读取整个文件

    3. 写入文件操作

    无论是文件读取还是文件写入 都是需要先打开文件 再进行操作

    3.1 file.Write 与 file.WriteString

    // 首先打开文件  O_RDWR  读写权限  O_TRUNC  清空文件  0 开头表示八进制 666表示 当用用户 当前组  其他用户 都是可读可写权限
    	file, err := os.OpenFile("1.text", os.O_RDWR|os.O_TRUNC, 0666)
    	if err != nil {
    		fmt.Printf("打开文件出现异常 %v", err)
    	}
    
    	defer file.Close()
    
    	// 返回 写入的字节数
    	write, err := file.Write([]byte("测试文件写入 \n"))
    	file.WriteString("一次写入整个字符串")
    
    	if err != nil {
    		fmt.Println(err)
    	}
    
    	fmt.Println(write)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3.2 bufio.NewWriter

    使用 bufio 一定要调用刷新

    // 基于缓存操作
    	file, err := os.OpenFile("2.text", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
    	if err != nil {
    		panic(err)
    	}
    
    	defer func() {
    		file.Close()
    		if e := recover(); e != nil {
    			fmt.Printf("异常 : 打开文件出现异常 %v", e)
    		}
    	}()
    
    	// 使用 bufio 基于缓存操作io流
    	// 需要传入 一个 io 接口包下的 Writer 接口实现类 而 file 实现了该 方法
    
    	writer := bufio.NewWriter(file)
    
    	writer.WriteString(" 写入缓存字符串内容 2")
    
    	//需要将缓存中的数据刷新到硬盘上
    	writer.Flush()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    img

    3.3 ioUtil 工具类

    	// 使用工具类  打开文件,写入文件一气呵成
    	err := ioutil.WriteFile("3.text", []byte("工具类写入内容"), 0666)
    
    	if err != nil {
    		fmt.Println("程序运行出现异常", err)
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    Redis JDBC
    用Blender制作YOLO目标检测器训练数据
    MyBatis if标签:条件判断
    【神经网络】一文带你轻松解析神经网络(附实例恶搞女友)
    【C++】string的接口从生涩到灵活使用——这篇文章就够了
    Java学习 --- super关键字
    基于 Apache Hudi 和 Apache Spark Sql 的近实时数仓架构分享
    将组件直接绑定到vue实例上面的写法
    redis性能优化及哨兵模式
    Linux 用户系统
  • 原文地址:https://blog.csdn.net/JAVAlife2021/article/details/125599765