打开和关闭文件

os.Open()函数能够打开一个文件,返回一个*File和一个err。
file.close()方法能够关闭文件。

//打开和关闭文件
func main()  {
    file,err := os.Open("test.txt")
    if err != nil{
        fmt.Println("打开文件失败",err)
        return
    }
    //文件能打开的情况下,使用defer延迟关闭文件
    defer file.Close()
}

读取文件

基本使用

file.Read()方法可以读取文件,它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0和io.EOF。
定义:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
func (f *File) Read(b []byte) (n int, err error)

示例:

func main() {
    //打开文件
    f,err := os.Open("woceng.txt")
    if err!= nil{
        fmt.Println("文件打开失败",err)
        return
    }
    //关闭文件
    defer f.Close()
    //读取文件
    var geci = make([]byte,256)
    g,err := f.Read(geci)
    if err == io.EOF{
        fmt.Println("文件读取完毕!")
        return
    }
    if err!= nil{
        fmt.Println("文件打开失败",err)
        return
    }
    //只会读取之前切片定义的256字节数据,若文件内容大于256字节,则超出部分无法显示
    fmt.Printf("读取了%d字节数据\n", g)
    fmt.Println(string(geci[:g]))
}

循环读取

使用for循环读取。

var geci = make([]byte,256)
    for {
        g,err := f.Read(geci)
        if err == io.EOF{
            fmt.Println("文件读取完毕!")
            return
        }
        if err!= nil{
            fmt.Println("文件打开失败",err)
            return
        }
        //会全部读取,但是每256字节会进行重新读取,可能会出现乱码
        fmt.Printf("读取了%d字节数据\n", g)
        fmt.Println(string(geci[:g]))
    }

bufio读取文件

读取文件中会有个缓冲区,先把内容读到缓冲区,然后统一读取,不过可能会丢数据(内存)。

func main()  {
    file,err := os.Open("woceng.txt")
    if err != nil{
        fmt.Println("文件读取错误",err)
        return
    }
    defer file.Close()
    // 利用缓冲区从文件读数据
    reader := bufio.NewReader(file)
    for{
        line,err := reader.ReadString('\n') //字符串读取,每到换行就停止
        if err == io.EOF {
            fmt.Println("文件读完了")
            break
        }
        if err != nil {
            fmt.Println("read file failed, err:", err)
            return
        }
        fmt.Print(line)
    }
}

ioutil读取整个文件

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

// ioutil读取文件
func readioutil(filename string)  {
    content,err := ioutil.ReadFile(filename)
    if err != nil{
        fmt.Println("文件读取错误",err)
        return
    }
    fmt.Println(string(content))
}

文件写入

os.OpenFile()方法实现文件写入相关功能。
语法:

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

name:要打开的文件名
flag:打开文件的模式
perm:文件权限,一个八进制数

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

Write和WriteString

//打开文件支持文件写入
func main()  {
    file,err := os.OpenFile("test.txt",os.O_CREATE|os.O_APPEND|os.O_WRONLY,0644)
    if err != nil{
        fmt.Println("打开文件失败",err)
        return
    }
    defer file.Close()
    str := "ares"
    file.Write([]byte("666\n")) //写入字节切片数据
    file.WriteString(str)       //直接写入字符串数据
}

bufio.NewWriter

将数据先写入缓存。

//打开文件支持文件写入
func main()  {
    file,err := os.OpenFile("test.txt",os.O_CREATE|os.O_APPEND|os.O_WRONLY,0644)
    if err != nil{
        fmt.Println("打开文件失败",err)
        return
    }
    defer file.Close()
    writer := bufio.NewWriter(file)
    for i := 0;i<10;i++{
        writer.WriteString("heoolo\n")  ////将数据先写入缓存
    }
    writer.Flush()  //将缓存中的内容写入文件
}

ioutil.WriteFile

将内容直接写入文件中,避免了打开文件操作。直接覆盖文件内容

func main()  {
    str := "aresares"
    err := ioutil.WriteFile("test.txt",[]byte(str),0644)
    if err != nil{
        fmt.Println("写文件失败",err)
        return
    }
}
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄