Go语言文件操作

1、使用os包读取文件的内容

// 自定义每次读取数据长度
func ReadFileFromOS() {
	file, err := os.Open("./abc")
	if err != nil {
		fmt.Printf("open file fail,err: %+v\n", err)
		return
	}
	// 关闭文件
	defer file.Close()
	// 定义一个长度为10的切片
	b := make([]byte, 10)
	for {
		n, err := file.Read(b)
		// _, err := file.Read(b)
		if err == io.EOF {
			// EOF表示end of file,文件读取完毕
			return
		}
		if err != nil {
			fmt.Printf("read file fail,err: %+v\n", err)
			return
		}
		// 打印读出的内容
		// 将切片转化为string,然后打印
		fmt.Printf("读取字节数:%d\n", n)
		fmt.Print(string(b))
	}
}

  在方法file.Read(b)中,入口参数是一个切片,切片的长度就是每次从文件中读取数据打长度,当文件中剩余内容小于这个切片的长度的时候,就读文件的剩下的内容,而不是切片的长度那样多的内容。当文件读到最后的时候,file.Read()返回一个文件结束信息,io.EOF

2、使用bufio包读取文件内容

  bufio也是一个可以用来读取文件的包

// 使用bufio包读文件
func ReadFileFromBufio() {
	file, err := os.Open("./abc")
	if err != nil {
		fmt.Printf("open file fail,err: %+v\n", err)
		return
	}
	// 关闭文件
	defer file.Close()
	newReader := bufio.NewReader(file)
	for {
		// 使用函数ReadString('\n')表示每次读取一个字符串,遇到'\n'表示读取当前字符串结束
		line, err := newReader.ReadString('\n')
		if err == io.EOF {
			return
		}
		if err != nil {
			fmt.Printf("read file fail,err: %+v\n", err)
		}
		fmt.Print(line)
	}
}

  使用这种方法就是创建一个Reader变量,用来读取文件内容,Reader包含的方法包括ReadLine,ReadString等等,同样的读到文件最后会返回文件结束符io.EOF

3、使用io/ioutil包一次性读取文件内容,这个方法比较简单

// 使用io/ioutil包读取文件内容
func ReadFileFromIOutil() {
	// content是一个byte类型的切片
	content, err := ioutil.ReadFile("./abc")
	if err != nil {
		fmt.Printf("read file fail,err: %+v\b", err)
		return
	}
	fmt.Println(string(content))
}

  它可以一次性读取文件的所有内容,而不需要使用循环来读取

4、使用os包的Write方法和WriteString方法向文件写入数据

  此时打开文件的方法是os.OpenFile()而不是os.Open()方法

  os.OpenFile(name string,flag int,perm FileMode)(*File,error)

  值得注意的是参数flag,就相当于c语言中打开文件的r,w,a等等标志,表示打开文件的模式,例如只读,只写,在后面添加等等

os.O_WRONLY 只写
os.O_CREATE 创建文件
os.O_RDONLY 只读
os.O_RDWR 读和写
os.O_TRUNC 清空文件,重新写
os.O_APPEND 在文件末尾添加

   第三个参数perm就是linux中的文件权限,例如0777,0666等等

func WriteFileByOs() {
	// 包含两个方法,Write和WriteString
	file, err := os.OpenFile("./def", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)
	if err != nil {
		fmt.Printf("open or create file fail,err: %+v\n", err)
		return
	}
	defer file.Close()
	// 直接使用Write和WriteString方法向文件写入数据,前者写入的类型为切片,后者为字符串
	file.Write([]byte("abc def hello world\n")) //强制类型转换,将字符串转化为byte类型的切片
	file.WriteString("hello baby\n")
	file.WriteString("gyy 110")
}

5、使用bufio包对文件进行写入数据

  与bufio中的reader读对象相对应的还有一个写对象writer,操作方式如下:

func WriteFileByBufio() {
	// 与reader相对应的右writer
	file, err := os.OpenFile("./def", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)
	if err != nil {
		fmt.Printf("open or create file fail,err: %+v\n", err)
		return
	}
	defer file.Close()
	newWriter := bufio.NewWriter(file)
	// 将要写入文件的内容先写入缓冲区
	newWriter.Write([]byte("ggg lol aaa\n"))
	newWriter.WriteString("abc is a pig\n")
	// 将缓冲区中的数据写入文件
	newWriter.Flush()
}

  在使用这种方法写入数据的时候,一定要记得在最后调用writer.Flush()方法将缓冲区中的内容写入文件。

6、最后就是使用io/ioutil包对文件写数据

  前面我们已经说了使用ioutil包的方法,ioutil.ReadFile()方法进行整个文件的读取,那么ioutil包中还有一个方法ioutil.WriteFile()对整个文件进行写入数据,他的默认的模式是当文件不存在的时候,创建文件,当文件中原来有数据,就删掉原来的数据,然后重新从头写入

func WriteFileByIOutil() {
	// 使用ioutil包中的方法,可以直接向文件写入数据
	str := "cyl is a cute girl\n"
	err := ioutil.WriteFile("./def", []byte(str), 0777)
	if err != nil {
		fmt.Printf("write data to file fail,err: %+v\n", err)
		return
	}
}

  

posted @ 2020-04-27 14:50  胖胖咩  阅读(236)  评论(0)    收藏  举报