标签 golang io 下的文章

Golang进阶-io操作

1. I/O操作也叫输入输出操作。I指Input,O指Output;用于读写数据的,有些语言也叫流操作,是指数据通信的通道;

2. io包里最重要的是两个接口:Reader和Writer接口

3. Reader接口

type Reader interface {
    Read(p []byte) (n int, err error)
}
它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误

4. 读取本地aa.txt文件的数据 (asdfgryuio)

  • 打开文件
fileName := "E:/GoPath/src/a/aa.txt"
    file, err := os.Open(fileName)
    if err != nil {
        fmt.Println("err: ", err)
        return
    }
  • 读取数据
//读取数据
    bs := make([]byte, 4, 4)
    //第一次读取
    n, err := file.Read(bs)
    fmt.Println(err)//<nil>
    fmt.Println(n)//4
    fmt.Println(bs)//[97 115 100 102]返回的是每个元素的字节编码数值
    fmt.Println(string(bs))//asdf

    //第二次读取
    n, err = file.Read(bs)
    fmt.Println(err)//<nil>
    fmt.Println(n)//4
    fmt.Println(bs)//[103 114 121 117]返回的是每个元素的字节编码数值
    fmt.Println(string(bs))//gryu

    //第三次读取
    n, err = file.Read(bs)
    fmt.Println(err)//<nil>
    fmt.Println(n)//2
    fmt.Println(bs)//[105 111 121 117]返回的是每个元素的字节编码数值
    fmt.Println(string(bs))//ioyu


    //第四次读取
    n, err = file.Read(bs)
    fmt.Println(err)//EOF
    fmt.Println(n)//0

//读取数据
    bs := make([]byte, 4, 4)
    n := -1
    for  {
        n, err = file.Read(bs)
        if  n == 0 || err == io.EOF{
            fmt.Println("到了文件末尾,结束读取...")
            break
        }
        fmt.Println(string(bs[:n]))

    }
  • 关闭文件
//可以用defer先关闭掉,以防漏写,造成资源泄露
    defer file.Close()

5. Writer接口

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

6. 写入到本地文件ab.txt

  • 打开文件(已存在的文件用open,不存在的用openFile)
//file, err := os.Open(fileName)
    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)


    if err != nil {
        fmt.Println("err: ", err)
        return
    }
  • 关闭文件 (以防忘掉,造成资源泄露)
defer file.Close()
  • 写入内容
//写入数据
    //bs := []byte{65,66,67,68,69,70}
    bs := []byte{97,98,99,100}
    //n,err := file.Write(bs)
    n,err := file.Write(bs[:2])
    fmt.Println(n)
    HandleErr(err)
    file.WriteString("\n")

    //直接写出字符串
    n,err = file.WriteString("Hello world")
    fmt.Println(n)
    HandleErr(err)
    file.WriteString("\n")

    //切片也可以直接写入字符串
    n,err = file.Write([]byte("totay"))
    fmt.Println(n)
    HandleErr(err)

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

7. writeAt方法指定从什么位置开始写,对应readAt从什么位置开始读