一,文件读取

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

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐