一文掌握 Go 文件的写入操作
admin
2024-03-24 08:10:13
0

一文掌握 Go 文件的写入操作

  • 前言
  • File.Write、File.WriteString、File.WriteAt
    • 文件写入操作
  • File.Seek
    • 应用
  • bufio.NewWriter、Writer.WriteString、Writer.Flush
    • 文件写入操作
  • 小结

耐心和持久胜过激烈和狂热。

哈喽大家好,我是陈明勇,今天分享的知识是 Go 文件的写入操作。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

前言

上篇文章 一文掌握 Go 文件的读取操作
介绍了如何使用 Go os 包和 bufio 包里的几个函数和方法,通过案例展示如何读取文件里的内容。本文接着上篇文章的内容,介绍文件的写入操作。

File.Write、File.WriteString、File.WriteAt

  • File.Write(b []byte) (n int, err error)
    直接操作磁盘往文件里写入数据,写入单位为字节。
    • b 参数:写入的数据,类型为字节切片。
    • 返回值 n:写入的字节数。
    • 返回值 err:写入数据的过程中产生的错误。
  • File.WriteString(s string) (n int, err error)
    直接操作磁盘往指定文件里写入数据,写入单位为字符串。
    • s 参数:写入的字符串数据。
    • 返回值 n:写入的字节数。
    • 返回值 err:写入数据的过程中产生的错误。
  • File.WriteAt(b []byte, off int64) (n int, err error)
    从指定位置 off 往文件里顺序写入数据,如果某个偏移量上有数据,则会覆盖。
    • b 参数:写入的数据,类型为字节切片。
    • off 参数:偏移量,从此位置开始写入数据。
    • 返回值 n:写入的字节数。
    • 返回值 err:写入数据的过程中产生的错误。

文件写入操作

import ("fmt""os"
)func main() {file, err := os.OpenFile("test.txt", os.O_CREATE, 0)if err != nil {fmt.Println(err)return}defer file.Close()count, err := file.Write([]byte{'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\n'})if err != nil {return}fmt.Printf("写入了 %d 字节\n", count)count, err = file.WriteString("Hello Golang")if err != nil {return}fmt.Printf("写入了长度为 %d 的字符串\n", count)count, err = file.WriteAt([]byte{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, 0)if err != nil {return}fmt.Printf("写入了 %d 字节\n", count)
}
  • 首先打开 test.txt 文件,指定的模式为 os.O_CREATE,如果文件不存在则会自动创建;
  • 然后通过 Write 方法以字符的形式往文件里写入 Hello World\n 的内容;
  • 接着通过 WriteString 方法以字符串的形式往文件里写入 Hello Golang 内容;此时文件里的内容如下所示:
    Hello World
    Hello Golang
    
  • 最后通过 WriteAt 方法,指定从偏移量为 0 的位置开始写入数据 xxxxxxxxxxx,由于 0 以及之后位置都有数据,因此原有数据被覆盖了。最后文件的内容为:
    xxxxxxxxxxx
    Hello Golang
    

File.Seek

  • File.Seek(offset int64, whence int)
    相对于开头位置或当前位置或末尾位置,将设置当前读或写的偏移量设置为 offset
    • offset 参数:所要设置的偏移量。
    • whence:相对于哪个位置开始设置偏移量的标志,可选值为 0 → 开头位置,1 → 当前位置,2 → 末尾位置。

应用

import ("fmt""os"
)func main() {file, err := os.OpenFile("test.txt", os.O_CREATE, 0)if err != nil {fmt.Println(err)return}defer file.Close()_, err = file.WriteString("G0lang")if err != nil {return}_, err = file.Seek(1, 0)if err != nil {fmt.Println(err)return}_, err = file.Write([]byte{'o'})if err != nil {fmt.Println(err)return}
}
  • 打开 test.txt 文件,指定的模式为 os.O_CREATE,如果文件不存在则会自动创建;
  • 使用 WriteString 方法往文件里写入 G0lang 字符串;
  • 此时发现第二个字符错了,0 应该改成 o;此时的偏移量是指向尾部的;使用 Seek 方法将偏移量移到第二个位置,然后写入字符 o,由于当前位置已有数据 0,因此 o 将会覆盖 0

bufio.NewWriter、Writer.WriteString、Writer.Flush

如果需要多次执行写入文件的操作,推荐使用 bufio 里的 Writer 结构体去操作,它会开辟一个缓冲区,默认大小为 4096 字节。在数据没有被刷入磁盘之前,所写入的数据都会暂时保存到缓冲区里。

  • NewWriter(w io.Writer) *Writer
    开辟一个默认值为 4096 字节的缓冲区,用于暂存写入文件的数据内容,返回一个 Writer 结构体的指针变量
    • w 参数:类型为 Writer 接口,实现这个接口的数据类型变量都可以作为参数,例如 File
    • 返回值 *Writer:一个 Writer 结构体的指针变量,通过该变量可以往缓冲区里写入数据。
  • Writer.WriteString(s string) (int, error)
    往缓冲区写入内容的方法。
    • 参数 s 为写入的字符串。
    • 第一个返回值为写入的字节数。
    • 第二个返回值为写入数据的过程中产生的错误。
  • Writer.Flush() error
    将所有的缓存数据写入磁盘。
    • 返回值为数据写入磁盘的过程中产生的错误。

文件写入操作


import ("bufio""fmt""os"
)func main() {file, err := os.OpenFile("test.txt", os.O_CREATE, 0)if err != nil {fmt.Println(err)return}defer file.Close()writer := bufio.NewWriter(file)_, err = writer.WriteString("Hello World\n")if err != nil {fmt.Println(err)return}_, err = writer.WriteString("Hello Golang\n")if err != nil {fmt.Println(err)return}_, err = writer.WriteString("Hello Gopher\n")if err != nil {fmt.Println(err)return}writer.Flush()
}
  • 首先打开 test.txt 文件,指定的模式为 os.O_CREATE,如果文件不存在则会自动创建;
  • 然后使用 NewWriter 函数获取一个 Writer 结构体的指针变量 writer
  • 接着通过 writerWriteString 方法将内容保存到缓冲区里;
  • 最后调用 Flush 方法,将所有的缓存数据写入磁盘。

小结

本文先是对 File.WriteFile.WriteStringFile.WriteAt 进行介绍,通过例子演示它们的使用方式;然后介绍 File.Seek,说明了它的用法;最后引出 bufio.NewWriterWriter.WriteStringWriter.Flush,使用它们代替 File 结构体里的写入方法,可以不用频繁操作磁盘,提高写入效率。

相关内容

热门资讯

金价银价,双双大涨 大河财立方消息,2月23日,受美国关税政策的不确定性及避险情绪影响推动,国际金价银价开盘再度双双走高...
春天养肝正当时,记住这三点,一... 这两天出门,大伙儿有没有发现?风变软了,不似冬天那般刺骨,路边的树枝也悄悄冒了嫩芽,地气一点点往上走...
【网络股指数ETF收涨约2.3... 【网络股指数ETF收涨约2.3%,领跑美股行业ETF】周三(2月25日),网络股指数ETF收涨2.2...
“哑铃型”结构显现 白酒市场如... 来源:滚动播报 (来源:北京商报) 随着春节假期结束,白酒市场逐渐步入消费淡季。今年春节假期,白酒市...
AI产业链方向低位震荡,人工智... 2月25日,AI产业链方向低位震荡,光通信、AIGC、AI算力等板块承压。截至收盘,中证人工智能主题...
大疆起诉美监管,数据看清资金连... 近期国产无人机龙头大疆正式起诉美国联邦通信委员会,挑战其将产品列入“受管制清单”的决定。消息一出,不...
欧盟终结小额免税政策!7月1日... 近日,欧盟最新跨境电商进口监管改革方案正式生效,核心变革在于废除长期实施的“价值低于150欧元小包裹...
个税年度汇算,今起预约! 据国家税务总局通告,2025年度个人所得税综合所得汇算清缴办理时间为2026年3月1日至6月30日。...
智洋创新终止收购灵明光子控股权... 2月25日晚间,智洋创新(SH688191,停牌)发布公告,宣布终止筹划以发行股份、可转债或现金等方...
一文吃透投资基础暗语,新手“养... 来源:《理财周刊》 最近本号受获得了很多新读者的关注。考虑到不少朋友还是新手,为了让大家读文章、看讨...
中芯国际:发行股份购买资产暨关... 2月25日,中芯国际(688981.SH)公告称,公司拟向国家集成电路产业投资基金股份有限公司、北京...
今晚油价上调,加满一箱油将多花... 记者今天从国家发展改革委了解到,2月24日24时国内成品油零售调价将开启上调窗口。据国家发展改革委价...
力挺民营经济!福州“政策大礼包... 24日 福州市民营经济强市 暨优化营商环境大会召开 会上 福州市优化营商环境十大典型案例 和最新惠企...
【春城时评】外卖与堂食并非“鱼... 你有没有遇到过这样的现象:“饭点”临近,找到一家味道可口的餐厅下单吃饭,却发现出餐口早已被外卖骑手包...
搓个“精致澡”悄然流行,长沙洗... 三湘都市报全媒体记者 仝若楠 美团数据显示,近四年洗浴行业交易规模连年攀升,2025年创下四年峰值,...
4000万粉丝网红杀入跨境,红... 作者丨AI柠檬 编辑丨Shadow 当不少内容团队谈“出海”,第一反应仍是把视频搬去 YouTube...
中国中免罕见跌停!港股3天跌超... 马年首个交易日,在沪深股指表现出色的背景下,“免税茅”中国中免低开低走,开盘后迅速封住跌停并维持到收...
价格上涨引燃资本市场热情,包钢... 2月25日,稀土永磁板块大爆发,包钢股份(600010.SH)、北方稀土(600111.SH)、中色...
深夜!黄金、白银、美股,全线爆... 2月25日晚间,全球多个资产爆发。 美股方面,道指、纳指与标普500三大指数全线飘红。 中概股方面...