Go中的io

90 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

文件访问权限常量定义

 // 只读方式打开文件
 O_RDONLY
 ​
 // 只写方式打开文件
 O_WRONLY
 ​
 // 读写方式打开文件
 O_RDWR
 ​
 // 向文件中写入数据时, 添加到文件末尾
 O_APPEND
 ​
 // 如果文件不存在, 则创建该文件
 O_CREATE
 ​
 // 和O_CREATE一同使用, 如果文件存在, 则返回错误
 O_EXCL
 ​
 // 以同步的方式打开文件
 O_SYNC
 ​
 // 如果文件存在, 则清空文件中的内容
 O_TRUNC

io读数据

 func ioRead()  {
    // 打开文件
    fo, err := os.OpenFile("./xx.txt", os.O_RDONLY, 0644)
    // 关闭文件
    defer fo.Close()
    if err != nil {
       fmt.Println("open file failed: ", err)
    }
    fmt.Println(fo.Name())
 ​
    // 创建切片, 指定长度, 将文件读到切片中
    s := make([]byte, 8)
 ​
    // 通过for循环将文件中的全部内容读取出来
    for {
       n, err := fo.Read(s);
       if err != nil {
          // 当文件读取完毕时, 返回EOF
          if err == io.EOF {
             fmt.Println("\n文件读取完毕")
          } else {
             // 其它错误
             fmt.Println("\n文件读取失败")
          }
          return
       }
       // 打印每次读取到的内容
       fmt.Print(string(s[:n]))
    }
 ​
    // 读取一次
    //_, err = fo.Read(s)
    if err != nil {
       fmt.Println("read file failed: ", err)
    }
    fmt.Println(string(s))
 }

io写数据

 func ioWrite()  {
    // 打开文件
    fo, err := os.OpenFile("./xx.txt", os.O_WRONLY | os.O_APPEND, 0644)
 ​
    // 关闭文件
    defer fo.Close()
    if err != nil {
       fmt.Println("open file failed: ", err)
    }
    fmt.Println(fo.Name())
 ​
    // 通过切片, 将数据写入文件
    str := "Hi gopher"
    _, err = fo.Write([]byte(str))
 ​
    // 通过字符串, 将数据写入文件
    //_, err = fo.WriteString("hi gopher")
    if err != nil {
       fmt.Println("write file failed: ", err)
    } else {
       fmt.Println("数据写入成功")
    }
 }

ioutil读数据

 func ioutilRead() {
    // 打开文件
    fo, err := os.OpenFile("./xx.txt", os.O_RDONLY, 0644)
 ​
    // 关闭文件
    defer fo.Close()
 ​
    if err != nil {
       fmt.Println("open file failed: ", err)
       return
    }
 ​
    // 读取文件中的所有内容
    s, err := ioutil.ReadAll(fo)
 ​
    // 使用ioutil包下的ReadFile方法直接读取文件
    //s, err := ioutil.ReadFile("./xx.txt")
 ​
    if err != nil {
       fmt.Println("read file failed: ", err)
       return
    }
 ​
    fmt.Println(string(s))
 }

ioutil写数据

 func ioutilWrite() {
    // 通过切片, 向文件中写入数据
    err := ioutil.WriteFile("./xx.txt", []byte("hi go"), 0644)
    if err != nil {
       fmt.Println("write file failed: ", err)
    }
    fmt.Println("数据写入成功")
 }

bufio读数据

 func bufioRead() {
    // 打开文件
    fo, err := os.OpenFile("./xx.txt", os.O_RDONLY, 0644)
 ​
    // 关闭文件
    defer fo.Close()
 ​
    if err != nil {
       fmt.Println("open file failed: ", err)
    }
    reader := bufio.NewReader(fo)
    //line, _, _ := reader.ReadLine()
    //fmt.Println(string(line))
 ​
    // 读取全部内容
    for {
       str, err := reader.ReadString('\n')
       fmt.Print(str)
       if err != nil {
          if err == io.EOF {
             fmt.Println("\n文件读取完成")
          } else {
             fmt.Println("\nread file failed: ", err)
          }
          return
       }
    }
 }

bufio写数据

 func bufioWrite()  {
    // 打开文件
    fo, err := os.OpenFile("./xx.txt", os.O_WRONLY, 0644)
 ​
    // 关闭文件
    defer fo.Close()
    if err != nil {
       fmt.Println("open file failed: ", err)
    }
 ​
    // 创建bufio的writer
    writer := bufio.NewWriter(fo)
 ​
    // 向文件中写入字符串
    n, err := writer.WriteString("hi")
    if err != nil {
       fmt.Println("write file failed: ", err)
       return
    }
    fmt.Println(n)
    writer.Flush()
 }

总结

Go中的文件操作方式有很多种, 但是它们的底层都是对file的封装, 以提供给我们一些常用的功能. 在使用的时候, 我们只需要选择最适合自己的文件操作方式就可以了!!!