Golang基础之文件操作

目录

  • 文件读取
    • os.open文件读取
    • os.open循环读取
    • bufio文件读取
    • bufio循环读取
    • ioutil读取整个文件
  • 文件写入
    • os.OpenFile文件写入
    • bufio.NewWriter文件写入
    • ioutil.WriteFile文件写入

在大多数语言中对于文件操作是必不可少的一个内容,那么在Go中os提供了文件的基本操作,除此以外为了追求便捷以及性能之上,Go 还在io/ioutil以及bufio提供一些其他函数供开发者使用

文件读取

os.open文件读取

os.open打开文件后赋给file然后通过read的方法读取并接收一个buf []byte 的参数类型,读取到文件末尾会返回0以及 io.EOF,可以通过0或者io.EOF进行判断文件是否读取完毕。

package main

import (
    "fmt"
    "os"
)

func main(){
    fileObj,err := os.Open("./main.go")
    if err != nil{
        fmt.Printf("open file failed err: %v",err)
        return
    }
    // 记得关闭文件
    defer fileObj.Close()
    // 使用Read方法读取文件数据
    //var tmp = make([]byte,128) // 指定读的长度
    var tmp [128]byte
    n,err := fileObj.Read(tmp[:])
    if err != nil{
        fmt.Printf("read from file failed err: %v",err)
        return
    }
    fmt.Printf("读了%d个字节\n",n)
    fmt.Println(string(tmp[:n]))
}

os.open循环读取

上面这种方式是一次性读取128byte的文件,如果需要将文件都读取完,就需要用到循环读取

package main

import (
    "fmt"
    "os"
)

func main(){
    fileObj,err := os.Open("./main.go")
    if err != nil{
        fmt.Printf("open file failed err: %v",err)
        return
    }
    defer fileObj.Close()
    // 使用Read方法读取文件数据
    var tmp [128]byte
    for {
        n,err := fileObj.Read(tmp[:])
        if err != nil{
            fmt.Printf("read from file failed err: %v",err)
            return
        }
        fmt.Printf("读了%d个字节\n",n)
        fmt.Println(string(tmp[:n]))
        if n < 128 {
            return
        }
    }
}

bufio文件读取

bufio 顾名思义就是带 buffer 的 IO

package main

import (
    "bufio"
    "fmt"
)

func main(){
    fileObj,err := os.Open("./main.go")
    if err != nil{
        fmt.Printf("open file failed err: %v",err)
        return
    }
    defer fileObj.Close()
    // 创建一个从文件中读内容的对象
    reader := bufio.NewReader(fileObj)
    line,err := reader.ReadString('\n')   //注意是字符
    if err == io.EOF {
        return
    }
    if err != nil{
        fmt.Printf("read line failed,err: %v",err)
        return
    }
    fmt.Print(line)
}

bufio循环读取

package main

import (
    "bufio"
    "fmt"
)

func main(){
    fileObj,err := os.Open("./main.go")
    if err != nil{
        fmt.Printf("open file failed err: %v",err)
        return
    }
    defer fileObj.Close()
    // 创建一个从文件中读内容的对象
    reader := bufio.NewReader(fileObj)
    for {
        line,err := reader.ReadString('\n') //注意是字符
        if err == io.EOF {
            return
        }
        if err != nil{
            fmt.Printf("read line failed,err: %v",err)
            return
        }
        fmt.Println(line)
    }
}

ioutil读取整个文件

io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入

package main

import (
    "fmt"
    "io/ioutil"
)

func main(){
    ret,err := ioutil.ReadFile("./main.go")
    if err != nil {
        fmt.Printf("read line failed,err: %v",err)
        return
    }
    fmt.Println(string(ret))
}

文件写入

os.OpenFile文件写入

os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能,它还提供了WriteString和Write两种方法,具体使用哪种根据个人需求。如下

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
    ....
}

其中:
1.name:要打开的文件名
2.flag:打开文件的模式。模式有以下几种:

模式 描述
os.O_WRONLY 只写
os.O_CREATE 创建文件
os.O_RDONLY 只读
os.O_RDWR 读写
os.O_TRUNC 清空
os.O_APPEND 追加

3.perm:文件权限,一个八进制数,r(读) 04、w(写) 02、x (执行) 01

package main

import (
    "fmt"
    "os"
)

func main(){
    file,err := os.OpenFile("a.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
    if err != nil{
        fmt.Printf("open file failed err:%v",err)
        return
    }
    defer file.Close()
    str := "hello world\n"
    file.Write([]byte(str)) // 写入字节切片数据
    file.WriteString(str)   // 直接写入字符串数据
}

bufio.NewWriter文件写入

bufio能够实现先将数据写入到缓存区,然后在从缓存中的内容写入到文件中。

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main(){
    file,err := os.OpenFile("a.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
    if err != nil{
        fmt.Printf("open file failed err:%v",err)
        return
    }
    defer file.Close()

    writer := bufio.NewWriter(file)
    str := "我的世界,由我做主\n"
    writer.WriteString(str) // 先将数据写入到缓存
    writer.Flush() // 将缓存中的内容写入文件中
}

ioutil.WriteFile文件写入

package main

import (
    "fmt"
    "io/ioutil"
)

func main(){
     str := "我的世界,你的世界\n"
     err := ioutil.WriteFile("a.txt",[]byte(str),0666)
     if err != nil {
         fmt.Printf("open file failed err:%v",err)
         return
     }
}

你可能感兴趣的:(Golang基础之文件操作)