参数:name 文件名(这里可以写相对路径,当然也可以写绝对路径)

 os.Create("./aaa.json")  // 这里创建一个.json文件
 os.Create("./aaa.txt")   // 这里创建一个.txt文件
 下图是vscode软件显示json文件和一般的文本文件的区别,这一点还是很友好的。

<2>os.Open()以只读的方式打开文件

参数:name 文件名包含路径(绝对路径和相对路径)

    注意:文件打开后,只能读取内容,不能写入和修改文件

// os.open()函数能打开一个文件
open, err := os.Open("./1.text")
if err != nil {
    //打印异常信息
    fmt.Println("open file err", err)
fmt.Println("文件获取完毕")
// 最后关闭文件,这一点是很重要的
// 没有出现异常,关闭文件
open.Close()  // open在这里是一个文件对象,所以这里可以调用Close()函数。

<3>os.OpenFile(): 以不同的模式打开文件

参数:name 文件名包含路径(绝对路径和相对路径)
参数:flag 打开文件的模式,常见的模式有:
      O_RDONLY(只读模式)、
      O_WRONLY(只写模式)、
      O_RDWR(可读可写模式)、
      O_APPEND(追加模式)
参数:perm 权限取值范围(0-70-没有任何权限
      1-执行权限,如果是可执行文件,是可以运行的
      2-写权限
      3-写权限与执行权限
      4-读权限
      5-读权限与执行权限
      6-读权限与写权限
      7-读权限、写权限、执行权限

3/函数的实战

<1>os.Open()

// os.open 函数能打开一个文件,最后调用 close() 方法 关闭文件。关闭文件这一点很重要。
open, err := os.Open("./1.text")
if err != nil {
    //打印异常信息
    fmt.Println("open file err", err)
fmt.Println("文件获取完毕")
// 没有出现异常,关闭文件
open.Close()  // open在这里是一个文件对象,所以这里可以调用Close()函数。
/////////////////////////////////////////////////////////////////////////////
// 为了防止忘记关闭文件,通常都将关闭文件的代码写在 defer 中。
// 打开文件
open, err := os.Open("./1.text")
// 在go语言中,defer后面的函数,会在当前函数执行结束时候,在return之前执行
defer func() {
    if open != nil {
        // 关闭文件
        open.Close()
if err != nil {
   //打印异常信息
   fmt.Println("open file err", err)
fmt.Println("文件获取完毕")

<2>os.OpenFile()以指定的模式打开文件

  有创建,只读,只写,读写,情况,追加

4/写文件

无论是文件读取还是文件写入 都是需要先打开文件 再进行操作。
有3种方式可以写入文件

<1>file.Write 与 file.WriteString

// 首先打开文件  O_RDWR  读写权限  O_TRUNC  清空文件  
// 0 开头表示八进制 666表示 当用用户 当前组  其他用户 都是可读可写权限
file, err := os.OpenFile("1.text", os.O_RDWR|os.O_TRUNC, 0666)
if err != nil {
     fmt.Printf("打开文件出现异常 %v", err)
defer file.Close()
// 返回 写入的字节数
write, err := file.Write([]byte("测试文件写入 \n"))
file.WriteString("一次写入整个字符串")
if err != nil {
        fmt.Println(err)
fmt.Println(write)

<2>bufio.NewWriter

// 基于缓存操作
file, err := os.OpenFile("2.text", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
if err != nil {
        panic(err)
defer func() {
        file.Close()
        if e := recover(); e != nil {
                fmt.Printf("异常 : 打开文件出现异常 %v", e)
// 使用 bufio 基于缓存操作io流
// 需要传入 一个 io 接口包下的 Writer 接口实现类 而 file 实现了该 方法
writer := bufio.NewWriter(file)
writer.WriteString(" 写入缓存字符串内容 2")
//需要将缓存中的数据刷新到硬盘上
writer.Flush()

<3>ioUtil 工具类

    // 使用工具类  打开文件,写入文件一气呵成
    err := ioutil.WriteFile("3.text", []byte("工具类写入内容"), 0666)
    if err != nil {
            fmt.Println("程序运行出现异常", err)

把json对象写入文件中

package main
import (
    _ "encoding/json"
    "io/ioutil"
    "time"
    "strconv"
    "fmt"
    "github.com/pquerna/ffjson/ffjson"
// 先声明一个结构体
// 要先定义json格式的结构体
type publishJson struct {
    BgId             string  `json:"bgId"`
    CandBgColor      string  `json:"candBgColor"`
    CurKbType        int     `json:"curKbType"`
    EffectId         string  `json:"effectId"`
    FontColor        string  `json:"fontColor"`
    FontColorChanged bool    `json:"fontColorChanged"`
    FontId           string  `json:"fontId"`
    KeyId            string  `json:"keyId"`
    KeyTransparent   float64 `json:"keyTransparent"`
    KeyboardBgName   string  `json:"keyboardBgName"`
    LocalSkinId      string  `json:"localSkinId"`
    Platform         int     `json:"platform"`
    PreviewName26    string  `json:"previewName26"`
    PreviewName9     string  `json:"previewName9"`
    SkinName         string  `json:"skinName"`
    SoundId          string  `json:"soundId"`
    UgcSkinVersion   int     `json:"ugcSkinVersion"`
    UseCustomBg      bool    `json:"useCustomBg"`
// 把内容写入到文件中,传入2个参数,第一个是文件名称,第二个是要写入的内容,类型是结构体
func Write2file(file_path string, content publishJson) error{
    // 将结构体的格式,转为json字符串的格式。这里用的到库包是"github.com/pquerna/ffjson/ffjson"
    data, err := ffjson.Marshal(content)
    checkError(err)
    // 将json格式的数据写入文件
    err = ioutil.WriteFile(path, data, 0777)
    checkError(err)
    return nil
func checkError(err error) {
    if err != nil {
        fmt.Println(err)
        panic(err)
func main() {
    // 初始化一个结构体对象
    theme_publish1 := publishJson{
        BgId:             "351",
        CandBgColor:      "0xdffffcfc",
        CurKbType:        2,
        EffectId:         "-1",
        FontColor:        "0xff000000",
        FontColorChanged: false,
        FontId:           "-1",
        KeyId:            "10",
        KeyTransparent:   59.025097,
        KeyboardBgName:   "keyboard_bg.png",
        LocalSkinId:      "loacl",
        Platform:         1,
        PreviewName26:    "",
        PreviewName9:     "square_preview.png",
        SkinName:         "bbb",
        SoundId:          "-1",
        UgcSkinVersion:   1,
        UseCustomBg:      false,
    file_name := "./theme_publish.json"
    Write2file(file_name, theme_publish1)

文件不存在则创建,如果文件已经存在则追加写入

package main
import (
    "log"
    "fmt"
// 声明一个结构体
type publishJson struct {
    BgId             string  `json:"bgId"`
    CandBgColor      string  `json:"candBgColor"`
    CurKbType        int     `json:"curKbType"`
    EffectId         string  `json:"effectId"`
    FontColor        string  `json:"fontColor"`
    FontColorChanged bool    `json:"fontColorChanged"`
    FontId           string  `json:"fontId"`
    KeyId            string  `json:"keyId"`
    KeyTransparent   float64 `json:"keyTransparent"`
    KeyboardBgName   string  `json:"keyboardBgName"`
    LocalSkinId      string  `json:"localSkinId"`
    Platform         int     `json:"platform"`
    PreviewName26    string  `json:"previewName26"`
    PreviewName9     string  `json:"previewName9"`
    SkinName         string  `json:"skinName"`
    SoundId          string  `json:"soundId"`
    UgcSkinVersion   int     `json:"ugcSkinVersion"`
    UseCustomBg      bool    `json:"useCustomBg"`
// 把内容写入文件的函数
// os.O_CREATE|os.O_APPEND|os.O_RDWR,就是文件不存在就创建,如果文件已经存在就追加写入。
func Write2file(path string, conten publishJson) {
     file, err := os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
     if err != nil {
        log.Fatal(err)
     // 颜氏函数,为了避免文件没有关闭
     defer func(file *os.File) {
        err := file.Close()
        if err != nil {
          log.Fatal(err)
     }(file)
    // 传入的conten是结构体的格式,需要转换为
    // 结构体转为json格式
    data, err := json.Marshal(conten)
    _, err = file.Write(data)
    if err != nil {
       log.Fatal(err)
// 下面的属性可以单独使用,也可以组合使用。
// 组合使用时可以使用 OR 操作设置 OpenFile的第二个参数,例如:
// os.O_CREATE|os.O_APPEND
// 或者 os.O_CREATE|os.O_TRUNC|os.O_WRONLY
// os.O_RDONLY // 只读
// os.O_WRONLY // 只写
// os.O_RDWR // 读写
// os.O_APPEND // 往文件中添建(Append)
// os.O_CREATE // 如果文件不存在则先创建
// os.O_TRUNC // 文件打开时裁剪文件
// os.O_EXCL // 和O_CREATE一起使用,文件不能存在
// os.O_SYNC // 以同步I/O的方式打开
复制代码
分类:
代码人生
标签: