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函数内部
}
上一篇下一篇

猜你喜欢

热点阅读