• golang 文件操作


    一,文件读取

    1,os.ReadFile 读取整个文件

    等价于原 ioutil.ReadFile方法, ioutil.ReadFile从go 1.16废弃了

    	content, err := os.ReadFile("test.txt")
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	fmt.Printf("File contents: %s", content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2,os.Open、*File.Read函数获取句柄按块读取
    	file, err := os.Open("test.txt")
    	defer file.Close()
    	if err != nil {
    		log.Fatal(err)
    	}
    	
    	var contents []byte
    	b := make([]byte, 3)
    	for {
    		// func (f *File) Read(b []byte) (n int, err error)
    		// At end of file, Read returns 0, io.EOF.
    		n, err := file.Read(b)
    		if n == 0 || err == io.EOF {
    			fmt.Println("读取文件结束", err)
    			break
    		}
    		contents = append(contents, b...)
    	}
    	fmt.Println(string(contents))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    3,bufio包读取文件

    3.1,bufio.Reader
    3.1.1 Read()方法 按块读取

    	file2, err := os.Open("test.txt")
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer file2.Close()
    
    	var contents2 []byte
    	r := bufio.NewReader(file2)
    	b2 := make([]byte, 3)
    	for {
    		_, err := r.Read(b2)
    		if err == io.EOF {
    			fmt.Println("读取文件结束", err)
    			break
    		} else if err != nil {
    			log.Fatal(err)
    		}
    		contents2 = append(contents2, b2...)
    	}
    	fmt.Println(string(contents2))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.1.2 ReadBytes() 、 ReadString() 按指定字符分块获取
    从输入中读取内容,直到碰到 delim 指定的字符,然后将读取到的内容连同 delim 字符一起放到缓冲区。

    	file4, err := os.Open("test.txt")
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer file4.Close()
    
    	r := bufio.NewReader(file4)
    	for {
    		//func (b *Reader) ReadString(delim byte) (string, error) {}
    		line, err := r.ReadString('\n')
    		line = strings.TrimSpace(line)
    		fmt.Println(line)
    		if err == io.EOF {
    			fmt.Println("读取文件结束", err)
    			break
    		} else if err != nil {
    			log.Fatal(err)
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.1.3 ReadLine()方法来读取每一行

    • 在 bufio 的源码注释中,曾说道 bufio.ReadLine() 是低级库,不太适合普通用户使用
    • 可以用ReadString(‘\n’)、ReadBytes(‘\n’)或者Scanner替换

    3.2,bufio.Scanner 按行读取

    file3, err := os.Open("test.txt")
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer file3.Close()
    
    	var lines []string
    	scanner := bufio.NewScanner(file3)
    	// Scanner 的 Scan() 方法读取文件的每一行,然后使用 Text() 方法获取每一行的内容
    	for scanner.Scan() {
    		lines = append(lines, scanner.Text())
    	}
    	err = scanner.Err()
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Println(lines)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    二,文件写入

    1,将字符串写入文件

    1.1 *File.WriteString写入字符串

    	file, err := os.OpenFile("test.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, os.ModePerm)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer file.Close()
    
    	// (f *File) WriteString(s string) (n int, err error)
    	n, err := file.WriteString("hello world!")
    	if err != nil {
    		fmt.Println(err)
    	}
    	fmt.Println(n, "bytes written successfully")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.2 os.WriteFile
    os.WriteFile是对os.openFile、*File.Write()的封装

    	str := []byte("hello world123")
    	err := os.WriteFile("test.txt", str, os.ModePerm)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2,fmt.Fprintln 函数 将 io.writer 做为参数写入
    	file, err := os.OpenFile("test.txt", os.O_CREATE|os.O_WRONLY, os.ModePerm)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer file.Close()
    
    	strings := []string{
    		"这是第一行数据,",
    		"这是第二行数据,",
    		"helo world!",
    	}
    
    	for _, v := range strings {
    		// Fprintln 函数 将 io.writer 做为参数
    		n, err := fmt.Fprintln(file, v)
    		if err != nil {
    			log.Fatal(err)
    		}
    		fmt.Println(n, "bytes written successfully")
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    3,bufio.Writer
    • 先将数据写入缓存区,再由缓冲区写入文件中
    • 根据设置缓存的大小,可以存储更多数据然后一次写入文件
    	file, err := os.OpenFile("test.txt", os.O_CREATE|os.O_WRONLY, os.ModePerm)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer file.Close()
    
    	writer := bufio.NewWriter(file)
    	// 字节写入
    	writer.Write([]byte("hello world \n"))
    	// 字符串写入
    	writer.WriteString("我的世界\n")
    	// 将缓冲中的数据写入
    	err = writer.Flush()
    	if err != nil {
    		log.Fatal(err)
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    三,文件删除、复制、重命名

    1,文件删除:os.Remove()、os.RemoveAll()
    • os.Remove() 删除文件或空目录
    • os.RemoveAll() 删除目录和它包含的所有子节点
    	err := os.RemoveAll("test.txt")
    	if err != nil {
    		log.Fatal(err)
    	}
    
    • 1
    • 2
    • 3
    • 4
    2,文件复制

    2.1 io.Copy复制文件

    	writerHandle, _ := os.OpenFile("test2.txt", os.O_CREATE|os.O_WRONLY, os.ModePerm)
    	defer writerHandle.Close()
    	readerHandle, _ := os.Open("test.txt")
    	defer readerHandle.Close()
    	io.Copy(writerHandle, readerHandle)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2 使用os.ReadFile()、os.WriteFile

    	data, err := os.ReadFile("test.txt")
    	if err != nil {
    		log.Fatal(err)
    	}
    	err = os.WriteFile("test3.txt", data, os.ModePerm)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3,重命名文件:os.Rename()
    	err := os.Rename("oldname.txt", "newname.txt")
    	if err != nil {
    		log.Fatal(err)
    	}
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    麒麟OS V10 设置开机自启动
    Go语言语法分析之我想打同事的脸--编译
    最大异或对
    怎么实现在微信公众号点外卖的功能
    使用verilog语言实现简单的卷积神经网络
    阶段六-Day05-MyBatis3
    sql面试
    数据结构与算法【Java】02---链表
    【图数据库实战】HugeGraph架构
    【C语言】函数
  • 原文地址:https://blog.csdn.net/bt_xxx/article/details/136623327