go 的文件处理

Posted Lemo_wd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go 的文件处理相关的知识,希望对你有一定的参考价值。

准备一个文件 imooc.txt

hello world!

 

一、使用 io/ioutil 包

定义一个 check 函数

func check(err error) {
	if err != nil {
		fmt.Println(err)
	}
}

1. 读文件(使用 ReadFile 或 ReadAll)

// ReadFile 直接读文件=> 切片序列
func demo_read_file(title string) {
	b, err := ioutil.ReadFile(title)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("ReadFile:%q\n", string(b))
}

// ReadAll 读取一个 io.Reader,返回字节序列
func demo_read_all(title string) {
	f, err := os.Open(title)
	check(err)
	defer f.Close()
	// 读取整个 Reader流
	b, err := ioutil.ReadAll(f)
	check(err)
	fmt.Printf("ReadAll: %q\n", string(b))
}

输出

ReadFile:"hello world!"
ReadAll: "hello world!"

2. 写文件(使用 WriteFile)

// WriteFile 直接将切片序列=> 文件
func demo_write_file() {
	// 如果文件不存在,则创建一个文件(有权限的话);否则清空文件。
	err := ioutil.WriteFile("imooc.txt", []byte("hello write!"), 0644)
	if err != nil {
		fmt.Println(err)
	}
}

再读一遍,输出:

ReadFile:"hello write!"

 

二、使用 os包

1. 打开文件

// Open 以O_RDONLY 的方式来打开文件
func demo_open() {
	f, err := os.Open("imooc.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	fmt.Println(f.Fd())
}

// OpenFile 以自定义的方法打开文件
func demo_open_file() {
	f, err := os.OpenFile("imooc.txt", os.O_RDWR|os.O_CREATE, 0775)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	fmt.Println(f.Fd())
}

输出

3
3

2. 读方法

// 读方法
func demo_read() {
	f, err := os.OpenFile("imooc.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0775)
	check(err)
	defer f.Close()

	buf := make([]byte, 2)
	_, err = f.Read(buf)
	check(err)
	fmt.Printf("Read1: %q\n", string(buf))

	// 第一个参数为偏移的大小;第二个位置为 0,1,2,分别代表开头,当前,结尾
	f.Seek(4, 1)

	_, err = f.Read(buf)
	check(err)
	fmt.Printf("Read2: %q\n", string(buf))

	r := bufio.NewReader(f)
	// 读取指定位数
	b, err := r.Peek(4)
	check(err)
	fmt.Printf("Peek: %q\n", string(b))

}

输出

Read1: "he"
Read2: "wr"
Peek: "ite!"

3. 写方法

// 写方法
func demo_write() {
	f, err := os.Create("imooc.bak")
	check(err)
	defer f.Close()

	// b := []byte{115, 111, 109, 101, 10}
	b := []byte("你好\n")

	// 如果文件存在,则清空文件。在打开的一个文件中,内容是往后添加,直到Close 该文件
	n, err := f.Write(b)
	check(err)
	fmt.Printf("Write: %d\n", n)

	n, err = f.WriteString("我们啊\n")
	check(err)
	fmt.Printf("WriteString: %d\n", n)

	f.Sync()

	w := bufio.NewWriter(f)
	n, err = w.WriteString("buffered\n")
	check(err)
	fmt.Printf("bufio WriteString: %d\n", n)

	// 必须刷新,才能看到文件内容
	w.Flush()
}

 再读一遍,输出

Write: 7
WriteString: 10
bufio WriteString: 9
ReadFile:"你好\n我们啊\nbuffered\n"

 

 三、整个文件

// demo_file.go

package main

import (
	"bufio"
	"fmt"
	"io/ioutil"
	"os"
)

func check(err error) {
	if err != nil {
		fmt.Println(err)
	}
}

// ---- 使用io/ioutil ----

// ReadFile 直接读文件=> 切片序列
func demo_read_file(title string) {
	b, err := ioutil.ReadFile(title)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("ReadFile:%q\n", string(b))
}

// WriteFile 直接将切片序列=> 文件
func demo_write_file() {
	// 如果文件不存在,则创建一个文件(有权限的话);否则清空文件。
	err := ioutil.WriteFile("imooc.txt", []byte("hello write!"), 0644)
	if err != nil {
		fmt.Println(err)
	}
}

// ReadAll 读取一个 io.Reader,返回字节序列
func demo_read_all(title string) {
	f, err := os.Open(title)
	check(err)
	defer f.Close()
	// 读取整个 Reader流
	b, err := ioutil.ReadAll(f)
	check(err)
	fmt.Printf("ReadAll: %q\n", string(b))
}

// ---- 使用os ----

// Open 以O_RDONLY 的方式来打开文件
func demo_open() {
	f, err := os.Open("imooc.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	fmt.Println(f.Fd())
}

// OpenFile 以自定义的方法打开文件
func demo_open_file() {
	f, err := os.OpenFile("imooc.txt", os.O_RDWR|os.O_CREATE, 0775)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	fmt.Println(f.Fd())
}

// 读方法
func demo_read() {
	f, err := os.OpenFile("imooc.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0775)
	check(err)
	defer f.Close()

	buf := make([]byte, 2)
	_, err = f.Read(buf)
	check(err)
	fmt.Printf("Read1: %q\n", string(buf))

	// 第一个参数为偏移的大小;第二个位置为 0,1,2,分别代表开头,当前,结尾
	f.Seek(4, 1)

	_, err = f.Read(buf)
	check(err)
	fmt.Printf("Read2: %q\n", string(buf))

	r := bufio.NewReader(f)
	// 读取指定位数
	b, err := r.Peek(4)
	check(err)
	fmt.Printf("Peek: %q\n", string(b))

}

// 写方法
func demo_write() {
	f, err := os.Create("imooc.bak")
	check(err)
	defer f.Close()

	// b := []byte{115, 111, 109, 101, 10}
	b := []byte("你好\n")

	// 如果文件存在,则清空文件。在打开的一个文件中,内容是往后添加,直到Close 该文件
	n, err := f.Write(b)
	check(err)
	fmt.Printf("Write: %d\n", n)

	n, err = f.WriteString("我们啊\n")
	check(err)
	fmt.Printf("WriteString: %d\n", n)

	f.Sync()

	w := bufio.NewWriter(f)
	n, err = w.WriteString("buffered\n")
	check(err)
	fmt.Printf("bufio WriteString: %d\n", n)

	// 必须刷新,才能看到文件内容
	w.Flush()
}

func main() {
	// demo_read_file("imooc.txt")
	// demo_read_all("imooc.txt")
	// demo_write_file()
	// demo_read_file("imooc.txt")
	// demo_open()
	// demo_open_file()
	// demo_read()
	demo_write()
	demo_read_file("imooc.bak")
}

 

四、os 包的其他方法(os

func IsExist(err error) bool
func IsNotExist(err error) bool

func Mkdir(name string, perm FileMode) error
func MkdirAll(path string, perm FileMode) error

func Remove(name string) error
func RemoveAll(path string) error
func Rename(oldpath, newpath string) error

func (m FileMode) IsDir() bool
func (m FileMode) IsRegular() bool

 

以上是关于go 的文件处理的主要内容,如果未能解决你的问题,请参考以下文章

解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段

你知道的Go切片扩容机制可能是错的

python常用代码片段总结

12. Go 语言文件处理

Go 处理yaml类型的配置文件

golang代码片段(摘抄)