網站首頁 編程語言 正文
前言
上篇文章 一文掌握 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
; - 接著通過
writer
的WriteString
方法將內容保存到緩沖區里; - 最后調用
Flush
方法,將所有的緩存數據寫入磁盤。
小結
本文先是對 File.Write
、File.WriteString
、File.WriteAt
進行介紹,通過例子演示它們的使用方式;然后介紹 File.Seek
,說明了它的用法;最后引出 bufio.NewWriter
、Writer.WriteString
、Writer.Flush
,使用它們代替 File 結構體里的寫入方法,可以不用頻繁操作磁盤,提高寫入效率。
原文鏈接:https://juejin.cn/post/7174056527643279397
相關推薦
- 2022-09-12 .Net6集成IdentityServer4?+AspNetCore?Identity讀取數據表用戶
- 2022-12-13 Android?DataBinding單向數據綁定深入探究_Android
- 2023-05-16 Python入門之布爾值詳解_python
- 2022-04-12 yarn:info There appears to be trouble with your ne
- 2022-01-15 cURL error 60: SSL certificate problem: unable to
- 2022-06-02 利用Python繪畫雙擺操作分享_python
- 2023-01-18 GO實現跳躍表的示例詳解_Golang
- 2022-07-01 Python直接使用plot()函數畫圖的方法實例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支