Golang IO操作详解

Go语言的IO操作可以使用其io包里的API实现。

Reader接口

type Reader interface {
    Read(p []byte) (n int, err, error) //参数是切片p;返回值n是实际读取到的字节数量,所以n最小是0最多不超过p的长度。如果读完了就会返回EOF
}

具体怎么使用呢?
举个例子:
如果我有一个文件test.txt,里面的内容是abcdefghijklmnopqrstuvwxyz,然后我想要用Reader接口读取里面的数据,就可以这样写:

package main

import (
    "fmt"
    "os"
)
func main()  {
    // 读取本地test.txt文件可分为3个步骤
    // 1.打开文件
    fileName := "/Users/liberhome/GolandProjects/awesomeProject/test/test.txt"
    file, err := os.Open(fileName)
    if err != nil {
        fmt.Println(err)
        return
    }
    // 3.关闭文件
    defer file.Close()
    // 2.读取数据
    bs := make([]byte, 15, 15)// 先创建一个切片,长度和容量都为4(这可以根据你的需求改变,常用1024的倍数)
    n, err := file.Read(bs)// 第一次从读取数据 存到准备好的切片里面
    fmt.Println(err)//nil
    fmt.Println(n)//15
    fmt.Println(string(bs))//abcdefghijklmno

    n, err = file.Read(bs)// 第2次读取数据
    fmt.Println(err)//nil
    fmt.Println(n)//11
    fmt.Println(string(bs))//pqrstuvwxyzlmno

    n, err = file.Read(bs)// 第3次读取数据
    fmt.Println(err)//EOF
    fmt.Println(n)//0
    fmt.Println(string(bs))//pqrstuvwxyzlmno
}

上述代码只是为了说明每一一次读取的工作原理,平时使用的的时候一般会用循环来写。
如下:

package main

import (
    "fmt"
    "os"
    "io"
)
func main()  {
    // 读取本地test.txt文件可分为3个步骤
    // 1.打开文件
    fileName := "/Users/liberhome/GolandProjects/awesomeProject/test/test.txt"
    file, err := os.Open(fileName)
    if err != nil {
        fmt.Println(err)
        return
    }
    // 3.关闭文件
    defer file.Close()
    // 2.读取数据
    bs := make([]byte, 15, 15)// 先创建一个切片,长度和容量都为4(这可以根据你的需求改变,常用1024的倍数)
    n := -1//返回读取的数量,初始化为-1
    for {
        n, err = file.Read(bs)
        if n == 0 || err == io.EOF{
            fmt.Println("读取到文件末尾 结束读取操作")
            break
        }
        fmt.Println(string(bs[:]))
    }
}

当然了,读文件还有一些其他的接口比如ReaderAt(从指定的位置开始读)、ReaderFrom(从指定对象读取)


Writer接口

type Writer interface {
    write(p []type) (n int, err error)
}

具体怎么使用呢?
举个例子:
如果我有一个文件test.txt或者没有也行(下面的代码可以在没有的情况下自动创建一个text.txt的文件),然后写入内容ABCDEF,就可以这样写:

package main

import (
    "fmt"
    "os"
    "log"
)

func main()  {
    fileName := "/Users/liberhome/GolandProjects/awesomeProject/I-package/April28_Go_io/test.txt"
    // step1 : 打开文件
    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, os.ModePerm)
    if err != nil {
        fmt.Println(err)
        return
    }
    // step3 : 关闭文件
    defer file.Close();
    // step2 : 写数据
    bs := []byte {65, 66, 67, 68, 69, 70,} //represent A, B, C, D, E, F
    n, err := file.Write(bs)
    fmt.Println(n)
    HandleErr(err)
}

func HandleErr(err error)  {
    if err != nil {
        log.Fatal(err)
    }
}

注意,这样写每次都是从文件开头写,如果已经有内容,已有内容会被覆盖,如果不想覆盖,可以考虑在代码中或上一个追加的权限:

    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)

除此之外,os包里面还有其他用于写文件的接口,比如StringWriter可直接写出字符串

    // 直接写出字符串
    n, err = file.WriteString("hey it is liber")
    fmt.Println(n)
    HandleErr(err)

参考资料来源:bilibili

你可能感兴趣的:(golangio)