golang 文件操作

2024-03-12 1037阅读

温馨提示:这篇文章已超过374天没有更新,请注意相关的内容是否还可用!

一,文件读取

1,os.ReadFile 读取整个文件

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

golang 文件操作
(图片来源网络,侵删)
	content, err := os.ReadFile("test.txt")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("File contents: %s", content)
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))
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))

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)
		}
	}

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,将字符串写入文件

    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 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)
    	}
    
    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")
    	}
    
    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,文件删除:os.Remove()、os.RemoveAll()
      • os.Remove() 删除文件或空目录
      • os.RemoveAll() 删除目录和它包含的所有子节点
        	err := os.RemoveAll("test.txt")
        	if err != nil {
        		log.Fatal(err)
        	}
        
        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)
        

        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)
        	}
        
        3,重命名文件:os.Rename()
        	err := os.Rename("oldname.txt", "newname.txt")
        	if err != nil {
        		log.Fatal(err)
        	}
        
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]