GO语言文件操作

打开和关闭文件

打开和关闭文件,os.Open()能够打开一个文件,返回*Fileerr。对得到的文件实例调用close()方法能够关闭文件。

func main() {
    //以只读方式打开文件,相对路径./1.txt
    fileobj, err := os.Open("./0.txt")
    //输出错误信息
    if err != nil {
        fmt.Printf("文件读取出错~~\nerr:%v\n", err)
        return
    }
    //注册延时关闭
    defer fileobj.Close()
}

读取文件

Read方法定义如下:

func (f *File) Read(b []byte) (n int, err error)

它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0io.EOF。 举个例子:

func main() {
    // 只读方式打开当前目录下的main.go文件
    file, err := os.Open("./main.go")
    if err != nil {
        fmt.Println("open file failed!, err:", err)
        return
    }
    defer file.Close()
    // 使用Read方法读取数据
    var tmp = make([]byte, 128)
    n, err := file.Read(tmp)
    if err == io.EOF {
        fmt.Println("文件读完了")
        return
    }
    if err != nil {
        fmt.Println("read file failed, err:", err)
        return
    }
    fmt.Printf("读取了%d字节数据\n", n)
    fmt.Println(string(tmp[:n]))
}

循环读取内容:

func main() {
    //以只读方式打开文件,相对路径./1.txt
    fileobj, err := os.Open("./a.txt")
    //输出错误信息
    if err != nil {
        fmt.Printf("第17行:文件读取出错~~\nerr:%v\n", err)
        return
    }
    //注册延时关闭
    defer fileobj.Close()

    //读取文件一
    data := make([]byte, 128)
    for {
        n, err := fileobj.Read(data)
        //文件读取完毕处理
        if err == io.EOF {
            fmt.Println("文件读取完毕。")
            return
        }
        //处理其它读取错误
        if err != nil {
            fmt.Printf("读取文件出错:\nErr:%v \n", err)
            return
        }
        //输出读取到的内容
        fmt.Printf("%s", string(data[:n]))
    }
}

bufio按行读取文件

func main() {
    //以只读方式打开文件
    fileobj, err := os.Open("./a.txt")
    //处理错误
    if err != nil {
        fmt.Printf("文件打开出错 \nErr:%v \n", err)
        return
    }

    //注册延时关闭文件句柄
    defer fileobj.Close()
    //创建一个读取内容的对象
    reader := bufio.NewReader(fileobj)
    //循环读取内容
    for {
        //以\n为分割,读取一行
        line, err := reader.ReadString('\n')
        //读取完毕处理
        if err == io.EOF {
            return
        }
        //处理其他读取错误
        if err != nil {
            fmt.Printf("文件读取出错:\nErr:%v \n", err)
        }
        //输出读取到的内容
        fmt.Print(line)
    }
}

ioutil读取整个文件

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

func main() {
    //用ioutil包读取文件最简单,给一个文件名就办了
    data, err := ioutil.ReadFile("./a.txt")
    //处理读取错误
    if err != nil {
        fmt.Printf("文件读取出错:\nErr:%v \n", err)
    }
    //输出读取到的内容
    fmt.Printf("%s", data)
}

写入文件

os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。

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

其中:

  • name:要打开的文件名
  • flag:打开文件的模式。模式具体含义看下表
  • perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。

flag模式有以下几种:

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

文件写入实例:

func main() {
    //打开文件:打开模式读写,创建,追加。
    file, err := os.OpenFile("./1.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
    //打开文件操作错误处理
    if err != nil {
        fmt.Printf("写入文前打开文件操作失败:\nErr:%v \n", err)
        return
    }
    //注册延时关闭文件函数
    defer file.Close()
    //要写入的字符串
    str := "基金半月赔3000块,赔了30% \n"
    //以字节切片方式写入
    n, err := file.Write([]byte(str))
    //写入结果处理
    if err != nil {
        //写入失败处理
        fmt.Printf("文件写入出错:\nErr:%v \n", err)
        retuen
    } else {
        //写入成功处理
        fmt.Printf("文件写入成功,本次写入[%d]字节。 \n", n)
    }
    //字符串方式写入
    n, err = file.WriteString(str)
    //写入结果处理
    if err != nil {
        //写入失败
        fmt.Printf("文件写入出错:\nErr:%v \n", err)
        retuen
    } else {
        //写入成功
        fmt.Printf("文件写入成功,本次写入[%d]字节。 \n", n)
    }
}

bufio包写文件操作:

func main() {
    //打开文件
    file, err := os.OpenFile("./1.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
    //打开文件操作错误处理
    if err != nil {
        fmt.Printf("写入文件前打开文件出错:\nErr:%v \n", err)
        return
    }
    //注册延时关闭文件函数
    defer file.Close()

    //写入文件
    str := "本公司提示:吸烟有害健康,请勿在禁烟场所吸烟🚬 \n"
    //创建写入缓冲区
    data := bufio.NewWriter(file)
    //向缓冲区存储要写入的文件
    data.WriteString(str)
    //将缓冲区写入文件
    err = data.Flush()
    //文件写入操作错误处理
    if err != nil {
        fmt.Printf("写入文件出错:\nErr:%v \n", err)
    }
}

ioutil包写入操作

ioutil包文件写入,注意,这个方法是清空写入。就是说如果指定的文件已经存在,新写入的文件会覆盖原文件。

func main() {
    //写入文件
    str := "本公司提示:吸烟有害健康,请勿在禁烟场所吸烟🚬 \n"
    err := ioutil.WriteFile("./1.txt", []byte(str), 0666)
    if err != nil {
        fmt.Printf("写入文件出错:\nErr:%v", err)
        return
    }
}

bufiob从标准输入读取

从用bufio包从标准输入读取内容,类似fmt.Scanln()函数

func main() {
    var s string
    //创建一个从标准输入读取内容的缓冲区
    input := bufio.NewReader(os.Stdin)
    //在缓冲区中搜索换行符'\n',将'\n'之前的内容存储到字符串变量s中
    s, err := input.ReadString('\n')
    //错误处理
    if err != nil {
        fmt.Printf("读取错误: \nErr:%v \n", err)
        return
    }
    //输出变量s的内容
    fmt.Printf("Type:%T \nValue:%#v \n", input, s)
}

  转载请注明: So Cold GO语言文件操作

 上一篇
flag包命令行参数 flag包命令行参数
Go标准库flag包基础用法Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。说白了就是命令行输入命令后面的那个参数的解析。 os.Args如果只是简单的随便带一个参数用os.Args就行。要使用os.A
2020-05-17
下一篇 
GO语言包 GO语言包
定义包我们还可以根据自己的需要创建自己的包。一个包可以简单理解为一个存放.go文件的文件夹。 该文件夹下面的所有go文件都要在代码的第一行添加如下代码,声明该文件归属的包。 package 包名注意事项: 一个文件夹下面直接包含的文件只能
2020-05-17
  目录