go常用操作文件有json,xml, gob 和txt,一般json,xml, gob 都是全部操作 很少修改一个部分快的内容, 所以一般采用 编码、解码实现,txt可能有追加所以相对难一点。 说说自己遇到的坑

1.验证文件或者目录是否存在

// 检查文件或目录是否存在
// 如果由 filename 指定的文件或目录存在则返回 true,否则返回 false
func IsExist(filename string) bool {_, err := os.Stat(filename)return err == nil || os.IsExist(err)
}

2在读取文本文件的时候

Readline读满缓冲区就返回,剩下的字节不会丢弃,留着下次读取。这样一行就拆分成了两次读取,两次读取出来的行都与预期的不符,后续的逻辑流程肯定也异常了
解决方法:
1.直接换成ReadBytes(’\ n’) 或 ReadString(’\ n’)
2.对isPrefix返回值做校验

3. os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666) 这个方法的flag一定要注意, 比如 设置成os.O_WRONLY|os.O_APPEND , 去读取文件, 结果是阻塞不是报错。

整个dmeo 如下:

package mainimport ("bufio""encoding/gob""encoding/json""encoding/xml""fmt""io""os"
)type Website struct {Name   string `xml:"name,attr"`Url    stringCourse []string
}var info []Websitefunc init() {info = []Website{{"Golang", "http://c.biancheng.net/golang/", []string{"http://c.biancheng.net/cplus/", "http://c.biancheng.net/linux_tutorial/"}},{"Java", "http://c.biancheng.net/java/", []string{"http://c.biancheng.net/socket/", "http://c.biancheng.net/python/"}},}/*列举了一些常用的 flag 文件处理参数:O_RDONLY:只读模式打开文件;O_WRONLY:只写模式打开文件;O_RDWR:读写模式打开文件;O_APPEND:写操作时将数据附加到文件尾部(追加);O_CREATE:如果不存在将创建一个新文件;O_EXCL:和 O_CREATE 配合使用,文件必须不存在,否则返回一个错误;O_SYNC:当进行一系列写操作时,每次都要等待上次的 I/O 操作完成再进行;O_TRUNC:如果可能,在打开时清空文件。*/
}// 检查文件或目录是否存在
// 如果由 filename 指定的文件或目录存在则返回 true,否则返回 false
func IsExist(filename string) bool {_, err := os.Stat(filename)return err == nil || os.IsExist(err)
}
func main() {WriteJson()ReadJson()WriteXml()ReadXML()WriteGob()ReadGob()WriteorCreatetxt()OpenAndAppendtxt()txtReadLine()
}func WriteJson() {path := "./info.json"if IsExist(path) {os.Remove(path)}fileptr, err := os.Create(path)if err != nil {fmt.Printf("crete json file has error:%v\n", err)return}defer fileptr.Close()encoder := json.NewEncoder(fileptr)err = encoder.Encode(info)if err != nil {fmt.Printf("json encode hase error %v\n", err)} else {fmt.Println("json write done")}
}func ReadJson() {path := "./info.json"fileptr, err := os.Open(path)if err != nil {fmt.Printf("open json file has error:%v\n", err)return}defer fileptr.Close()var tmp []Websitedecoder := json.NewDecoder(fileptr)err = decoder.Decode(&tmp)if err != nil {fmt.Printf("json decode has error:%v\n", err)}fmt.Println("json read done")fmt.Print(tmp)
}func WriteXml() {path := "./info.xml"if IsExist(path) {os.Remove(path)}fileptr, err := os.Create(path)if err != nil {fmt.Printf("crete xml file has error:%v\n", err)return}defer fileptr.Close()encoder := xml.NewEncoder(fileptr)err = encoder.Encode(info)if err != nil {fmt.Printf("xml encode hase error %v\n", err)} else {fmt.Println("xml write done")}
}func ReadXML() {path := "./info.xml"fileptr, err := os.Open(path)if err != nil {fmt.Printf("open xml file has error:%v\n", err)return}defer fileptr.Close()var tmp []Websitedecoder := xml.NewDecoder(fileptr)err = decoder.Decode(&tmp)if err != nil {fmt.Printf("xml decode has error:%v\n", err)}fmt.Println("xml read done")fmt.Print(tmp)
}func WriteGob() {path := "./demo.gob"if IsExist(path) {os.Remove(path)}file, _ := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0777)defer file.Close()enc := gob.NewEncoder(file)if err := enc.Encode(info); err != nil {fmt.Printf("gob endcod  has err:%v", err)} else {fmt.Println("gob write don")}
}
func ReadGob() {path := "./demo.gob"fileptr, err := os.Open(path)if err != nil {fmt.Printf("open gob file has error:%v\n", err)return}defer fileptr.Close()var tmp []Websitedecoder := gob.NewDecoder(fileptr)err = decoder.Decode(&tmp)if err != nil {fmt.Printf("gob decode has error:%v\n", err)}fmt.Println("gob read done")fmt.Print(tmp)
}
func WriteorCreatetxt() {filePath := "./info.txt"file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {fmt.Printf("txt open file has err:%v", err)}defer file.Close()//写入文件时,使用带缓存的 *Writerwrite := bufio.NewWriter(file)for i := 0; i < 5; i++ {write.WriteString(fmt.Sprintf("hello:%d \r\n", i+1))}//Flush将缓存的文件真正写入到文件中write.Flush()fmt.Println("txt write done")
}func OpenAndAppendtxt() {filePath := "./info.txt"file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)if err != nil {fmt.Printf("txt open file has err:%v", err)}defer file.Close()//读原来文件的内容,并且显示在终端reader := bufio.NewReader(file)for {str, err := reader.ReadString('\n')if err == io.EOF {break}fmt.Print(str)}//写入文件时,使用带缓存的 *Writerwrite := bufio.NewWriter(file)for i := 0; i < 5; i++ {write.WriteString(fmt.Sprintf("world %d\r\n", i+1))}//Flush将缓存的文件真正写入到文件中write.Flush()fmt.Println("txt append done")
}/*Readline读满缓冲区就返回,剩下的字节不会丢弃,留着下次读取。
这样一行就拆分成了两次读取,两次读取出来的行都与预期的不符,后续的逻辑流程肯定也异常了
解决方法:
1.直接换成ReadBytes(’\ n’) 或 ReadString(’\ n’)
2.对isPrefix返回值做校验
*/
func txtReadLine() {// 打开test.txt文件fi, err := os.Open("./test.txt")if err != nil {fmt.Println("open file error:", err)return}defer fi.Close()// 逐行读取记录br := bufio.NewReader(fi)var buf []bytefor {line, prefix, err := br.ReadLine()if err == io.EOF {break}// 追加到自定义缓冲区内buf = append(buf, line...)// 如果prefix为真,则代表该行还有尚未读取完的数据,跳过后续具体操作,继续读取完该行剩余内容if prefix {continue}str := string(buf)fmt.Printf("--------------------\n")fmt.Println("len(buf) = ", len(buf))fmt.Println("len(str) = ", len(str))fmt.Println(str)fmt.Printf("--------------------\n\n")// 清空切片buf = append(buf[:0], buf[len(buf):]...)}fmt.Println("txt readline done")
}

go 文件操作实践[读写json xlm gob txt]相关推荐

  1. 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 追加键值对数据 | 更新键值对数据 )

    文章目录 一.追加键值对数据 二.更新键值对数据 三.完整代码示例 一.追加键值对数据 在上一篇博客 [C 语言]文件操作 ( 配置文件读写 | 写出或更新配置文件 | 逐行遍历文件文本数据 | 获取 ...

  2. 【Java文件操作(五)】从txt文件中读取字符串、乱码原因

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  3. 【C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解】

    文章目录 一.json文件简介 1.json文件 2.json与其他存储数据方式比较 二.C++操作json文件 1.jsoncpp 库下载 2.C++从字符串中读取json 1.简单json样式 2 ...

  4. C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解

    目录 前言 一.json文件简介 1.json文件 2.json与其他存储数据方式比较 二.C++操作json文件 1.jsoncpp 库下载 2.C++从字符串中读取json 3.C++从文件中读取 ...

  5. Python基础(三)文件操作和处理json

    文件操作步骤:1.有一个文件,2.打开文件,3.读写修改文件,4.关闭文件 一.有一个文件:新建或导入文件 二.打开文件:如果是新建的文件默认和py文件在同一个目录:如果是打开文件,要将文件放在py同 ...

  6. Python基本语法_文件操作_读写函数详解

    目录 目录 软件环境 file文件对象 open文件操作 读文件 read读取所有文件内容 readline获取一行内容 readlines读取所有文件内容 readreadlinereadlines ...

  7. golang 文件操作 创建 读写 复制移动 权限 删除

    目录 介绍 基本操作 创建空文件 Truncate文件 得到文件信息 重命名和移动 删除文件 打开和关闭文件 检查文件是否存在 检查读写权限 改变权限.拥有者.时间戳 硬链接和软链接 读写 复制文件 ...

  8. 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 函数形参设置 | 确保打开文件成功 | 统计文件大小 )

    文章目录 一.函数形参设置 二.确保打开文件成功 三.统计文件大小 一.函数形参设置 函数形参设置 : 该函数的作用是 写出或更新配置项 , 遍历每行数据 , 检查 key 键 是否存在 , 如果存在 ...

  9. C文件操作、读写文件 C++文件读写、文件操作

    转自  飘羽随风 基于C的文件操作  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FI ...

最新文章

  1. NET::ERR_CACHE_MISS
  2. Java日期时间使用总结
  3. Sublime Text 3插件收集
  4. 京东也不甘当当后!买书4折优惠!
  5. 基于pygtk的linux有道词典
  6. leetcode majority number
  7. 火狐导cookie文件没反应_效率指南|实操区分FireFox火狐的国内版和国际版
  8. 永辉发布元宵数据:汤圆销售明显提升,多个民生产品增长超150%
  9. Quartz学习总结(2)——定时任务框架Quartz详解
  10. 卡巴斯基发现ATM病毒Skimmer改进版
  11. 日历获取当前月份的月数与当前月份第一天离第一个格子的位置。
  12. AUTOCAD——光顺曲线命令、分解命令
  13. SpringBoot整合ureport2
  14. ECSHOP二次开发之心得体验
  15. 适合普通大学生的前端开发学习路线
  16. 大O符号/大Ω符号/大Θ符号/小o符号/小w符号等各种算法复杂度记法含义
  17. 秦嘉哲:12.13黄金原油欧盘操作计划、黄金原油最新分析及策略布局
  18. 黑鹰的VIP数据库(一)
  19. qt做标定软件_有什么很好的软件是用 Qt 编写的?
  20. js实现数据统计分类

热门文章

  1. 动态域名相关内容(持续更新篇)
  2. spotify使用教程_如何使用Wine在Ubuntu 9.10中安装Spotify
  3. 有你的地方就是年——请查收你的春节烟花(零点定时跳转)
  4. C\C++之(++p)->x 与 ++p->x的区别小记
  5. textarea 换行输出实现
  6. 自由人NFT:无聊猿NFT的前世今生
  7. 4g网络什么时候淘汰_5G手机即将到来,那4G手机多久才会被淘汰呢?看完你就懂了!...
  8. Sublime安装插件步骤记录
  9. html中label标签的使用
  10. 【计算机视觉】森林火灾检测-2