Go核心编程-文件操作 [IO]
2019-05-06 本文已影响0人
大鱼人Echo
文件概念
文件我们都不陌生,文件就是保存数据的地方,比如大家机场使用的word文档,txt文件,excel文件都是文件
文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音
输入流和输出流
文件在程序中是以流的形式来操作的
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件的)路径
os.File封装所有文件相关操作,File是一个结构体
// os包里的Open函数
func Open(name string) (*File, error) {
return OpenFile(name, O_RDONLY, 0)
}
// os 包里Close方法
func (f *File) Close() error {
if f == nil {
return ErrInvalid
}
return f.file.close()
}
读取文件实例
案例1. 读取文件的内容并显示在终端(带缓冲区的方式),使用 os.Open, file.Close, bufio.NewReader(), reader.ReadString 函数和方法
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// 1. 打开文件
file, err := os.Open("./test02.txt")
if err != nil {
fmt.Println("open file err=", err)
return
}
// 2. 当函数退出时,要及时的关闭file
defer file.Close() // 要及时关闭file句柄,否则会有内存泄漏
// 创建一个*Reader, 是带缓冲的
reader := bufio.NewReader(file)
// 循环读取文件的内容
for {
str, err := reader.ReadString('\n') // 读到一个换行就打印到控制台
if err == io.EOF { // io.EOF表示文件的末尾
break
}
fmt.Print(str)
}
fmt.Println("文件读取结束...")
}
案例2. 读取文件的内容并显示在终端(使用 ioutil 一次将整个文件读入到内存中),这种方式适用于文件 不大的情况。相关方法和函数(ioutil.ReadFile)
package main
import (
"fmt"
"io/ioutil"
)
func main() {
filePath := "./test03.txt"
// 1. 使用ioutil.ReadFile一次性将文件读取到位
content, err := ioutil.ReadFile(filePath)
if err != nil {
fmt.Printf("read file err=%v", err)
}
// 2. 把读取的内容显示到终端
fmt.Printf("%v", string(content)) // 由于读取到的是[]byte 需要用string转换一下
// 3. 我们没有显式的Open文件, 因此也不需要显式的Close文件
// 因为文件的Open和Close被封装在了ReadFile函数内部
}