go 文件操作实践[读写json xlm gob txt]
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]相关推荐
- 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 追加键值对数据 | 更新键值对数据 )
文章目录 一.追加键值对数据 二.更新键值对数据 三.完整代码示例 一.追加键值对数据 在上一篇博客 [C 语言]文件操作 ( 配置文件读写 | 写出或更新配置文件 | 逐行遍历文件文本数据 | 获取 ...
- 【Java文件操作(五)】从txt文件中读取字符串、乱码原因
我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...
- 【C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解】
文章目录 一.json文件简介 1.json文件 2.json与其他存储数据方式比较 二.C++操作json文件 1.jsoncpp 库下载 2.C++从字符串中读取json 1.简单json样式 2 ...
- C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解
目录 前言 一.json文件简介 1.json文件 2.json与其他存储数据方式比较 二.C++操作json文件 1.jsoncpp 库下载 2.C++从字符串中读取json 3.C++从文件中读取 ...
- Python基础(三)文件操作和处理json
文件操作步骤:1.有一个文件,2.打开文件,3.读写修改文件,4.关闭文件 一.有一个文件:新建或导入文件 二.打开文件:如果是新建的文件默认和py文件在同一个目录:如果是打开文件,要将文件放在py同 ...
- Python基本语法_文件操作_读写函数详解
目录 目录 软件环境 file文件对象 open文件操作 读文件 read读取所有文件内容 readline获取一行内容 readlines读取所有文件内容 readreadlinereadlines ...
- golang 文件操作 创建 读写 复制移动 权限 删除
目录 介绍 基本操作 创建空文件 Truncate文件 得到文件信息 重命名和移动 删除文件 打开和关闭文件 检查文件是否存在 检查读写权限 改变权限.拥有者.时间戳 硬链接和软链接 读写 复制文件 ...
- 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 函数形参设置 | 确保打开文件成功 | 统计文件大小 )
文章目录 一.函数形参设置 二.确保打开文件成功 三.统计文件大小 一.函数形参设置 函数形参设置 : 该函数的作用是 写出或更新配置项 , 遍历每行数据 , 检查 key 键 是否存在 , 如果存在 ...
- C文件操作、读写文件 C++文件读写、文件操作
转自 飘羽随风 基于C的文件操作 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FI ...
最新文章
- NET::ERR_CACHE_MISS
- Java日期时间使用总结
- Sublime Text 3插件收集
- 京东也不甘当当后!买书4折优惠!
- 基于pygtk的linux有道词典
- leetcode majority number
- 火狐导cookie文件没反应_效率指南|实操区分FireFox火狐的国内版和国际版
- 永辉发布元宵数据:汤圆销售明显提升,多个民生产品增长超150%
- Quartz学习总结(2)——定时任务框架Quartz详解
- 卡巴斯基发现ATM病毒Skimmer改进版
- 日历获取当前月份的月数与当前月份第一天离第一个格子的位置。
- AUTOCAD——光顺曲线命令、分解命令
- SpringBoot整合ureport2
- ECSHOP二次开发之心得体验
- 适合普通大学生的前端开发学习路线
- 大O符号/大Ω符号/大Θ符号/小o符号/小w符号等各种算法复杂度记法含义
- 秦嘉哲:12.13黄金原油欧盘操作计划、黄金原油最新分析及策略布局
- 黑鹰的VIP数据库(一)
- qt做标定软件_有什么很好的软件是用 Qt 编写的?
- js实现数据统计分类
热门文章
- 动态域名相关内容(持续更新篇)
- spotify使用教程_如何使用Wine在Ubuntu 9.10中安装Spotify
- 有你的地方就是年——请查收你的春节烟花(零点定时跳转)
- C\C++之(++p)->x 与 ++p->x的区别小记
- textarea 换行输出实现
- 自由人NFT:无聊猿NFT的前世今生
- 4g网络什么时候淘汰_5G手机即将到来,那4G手机多久才会被淘汰呢?看完你就懂了!...
- Sublime安装插件步骤记录
- html中label标签的使用
- 【计算机视觉】森林火灾检测-2