一文帶你掌握Go語(yǔ)言中文件的寫入操作
前言
上篇文章 一文掌握 Go 文件的讀取操作 介紹了如何使用 Go os 包和 bufio 包里的幾個(gè)函數(shù)和方法,通過(guò)案例展示如何讀取文件里的內(nèi)容。本文接著上篇文章的內(nèi)容,介紹文件的寫入操作。
File.Write、File.WriteString、File.WriteAt
File.Write(b []byte) (n int, err error)
直接操作磁盤往文件里寫入數(shù)據(jù),寫入單位為字節(jié)。
b參數(shù):寫入的數(shù)據(jù),類型為字節(jié)切片。- 返回值
n:寫入的字節(jié)數(shù)。 - 返回值
err:寫入數(shù)據(jù)的過(guò)程中產(chǎn)生的錯(cuò)誤。
File.WriteString(s string) (n int, err error)
直接操作磁盤往指定文件里寫入數(shù)據(jù),寫入單位為字符串。
s參數(shù):寫入的字符串?dāng)?shù)據(jù)。- 返回值
n:寫入的字節(jié)數(shù)。 - 返回值
err:寫入數(shù)據(jù)的過(guò)程中產(chǎn)生的錯(cuò)誤。
File.WriteAt(b []byte, off int64) (n int, err error)
從指定位置 off 往文件里順序?qū)懭霐?shù)據(jù),如果某個(gè)偏移量上有數(shù)據(jù),則會(huì)覆蓋。
b參數(shù):寫入的數(shù)據(jù),類型為字節(jié)切片。off參數(shù):偏移量,從此位置開始寫入數(shù)據(jù)。- 返回值
n:寫入的字節(jié)數(shù)。 - 返回值
err:寫入數(shù)據(jù)的過(guò)程中產(chǎn)生的錯(cuò)誤。
文件寫入操作
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 字節(jié)\n", count)
count, err = file.WriteString("Hello Golang")
if err != nil {
return
}
fmt.Printf("寫入了長(zhǎng)度為 %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 字節(jié)\n", count)
}首先打開 test.txt 文件,指定的模式為 os.O_CREATE,如果文件不存在則會(huì)自動(dòng)創(chuàng)建;
然后通過(guò) Write 方法以字符的形式往文件里寫入 Hello World\n 的內(nèi)容;
接著通過(guò) WriteString 方法以字符串的形式往文件里寫入 Hello Golang 內(nèi)容;此時(shí)文件里的內(nèi)容如下所示:
Hello World
Hello Golang
最后通過(guò) WriteAt 方法,指定從偏移量為 0 的位置開始寫入數(shù)據(jù) xxxxxxxxxxx,由于 0 以及之后位置都有數(shù)據(jù),因此原有數(shù)據(jù)被覆蓋了。最后文件的內(nèi)容為:
xxxxxxxxxxx
Hello Golang
File.Seek
File.Seek(offset int64, whence int)
相對(duì)于開頭位置或當(dāng)前位置或末尾位置,將設(shè)置當(dāng)前讀或?qū)懙钠屏吭O(shè)置為 offset。
offset參數(shù):所要設(shè)置的偏移量。whence:相對(duì)于哪個(gè)位置開始設(shè)置偏移量的標(biāo)志,可選值為0→ 開頭位置,1→ 當(dāng)前位置,2→ 末尾位置。
應(yīng)用
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,如果文件不存在則會(huì)自動(dòng)創(chuàng)建; - 使用
WriteString方法往文件里寫入G0lang字符串; - 此時(shí)發(fā)現(xiàn)第二個(gè)字符錯(cuò)了,
0應(yīng)該改成o;此時(shí)的偏移量是指向尾部的;使用Seek方法將偏移量移到第二個(gè)位置,然后寫入字符o,由于當(dāng)前位置已有數(shù)據(jù)0,因此o將會(huì)覆蓋0;
bufio.NewWriter、Writer.WriteString、Writer.Flush
如果需要多次執(zhí)行寫入文件的操作,推薦使用 bufio 里的 Writer 結(jié)構(gòu)體去操作,它會(huì)開辟一個(gè)緩沖區(qū),默認(rèn)大小為 4096 字節(jié)。在數(shù)據(jù)沒(méi)有被刷入磁盤之前,所寫入的數(shù)據(jù)都會(huì)暫時(shí)保存到緩沖區(qū)里。
NewWriter(w io.Writer) *Writer
開辟一個(gè)默認(rèn)值為 4096 字節(jié)的緩沖區(qū),用于暫存寫入文件的數(shù)據(jù)內(nèi)容,返回一個(gè) Writer 結(jié)構(gòu)體的指針變量
w參數(shù):類型為Writer接口,實(shí)現(xiàn)這個(gè)接口的數(shù)據(jù)類型變量都可以作為參數(shù),例如File。- 返回值
*Writer:一個(gè)Writer結(jié)構(gòu)體的指針變量,通過(guò)該變量可以往緩沖區(qū)里寫入數(shù)據(jù)。
Writer.WriteString(s string) (int, error)
往緩沖區(qū)寫入內(nèi)容的方法。
- 參數(shù)
s為寫入的字符串。 - 第一個(gè)返回值為寫入的字節(jié)數(shù)。
- 第二個(gè)返回值為寫入數(shù)據(jù)的過(guò)程中產(chǎn)生的錯(cuò)誤。
Writer.Flush() error
將所有的緩存數(shù)據(jù)寫入磁盤。
返回值為數(shù)據(jù)寫入磁盤的過(guò)程中產(chǎn)生的錯(cuò)誤。
文件寫入操作
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,如果文件不存在則會(huì)自動(dòng)創(chuàng)建; - 然后使用
NewWriter函數(shù)獲取一個(gè)Writer結(jié)構(gòu)體的指針變量writer; - 接著通過(guò)
writer的WriteString方法將內(nèi)容保存到緩沖區(qū)里; - 最后調(diào)用
Flush方法,將所有的緩存數(shù)據(jù)寫入磁盤。
小結(jié)
本文先是對(duì) File.Write、File.WriteString、File.WriteAt 進(jìn)行介紹,通過(guò)例子演示它們的使用方式;然后介紹 File.Seek,說(shuō)明了它的用法;最后引出 bufio.NewWriter、Writer.WriteString、Writer.Flush,使用它們代替 File 結(jié)構(gòu)體里的寫入方法,可以不用頻繁操作磁盤,提高寫入效率。
到此這篇關(guān)于一文帶你掌握Go語(yǔ)言中文件的寫入操作的文章就介紹到這了,更多相關(guān)Go語(yǔ)言文件寫入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)超時(shí)的三種方法實(shí)例
超時(shí)在一些業(yè)務(wù)場(chǎng)景里非常普遍,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言實(shí)現(xiàn)超時(shí)的三種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Go語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-07-07
go本地環(huán)境配置及vscode go插件安裝的詳細(xì)教程
這篇文章主要介紹了go本地環(huán)境配置及vscode go插件安裝的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
go語(yǔ)言string轉(zhuǎn)結(jié)構(gòu)體的實(shí)現(xiàn)
本文主要介紹了go語(yǔ)言string轉(zhuǎn)結(jié)構(gòu)體的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
go語(yǔ)言的panic和recover函數(shù)用法實(shí)例
今天小編就為大家分享一篇關(guān)于go語(yǔ)言的panic和recover函數(shù)用法實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
Golang?實(shí)現(xiàn)Redis?協(xié)議解析器的解決方案
這篇文章主要介紹了Golang???實(shí)現(xiàn)?Redis?協(xié)議解析器,本文將分別介紹Redis 通信協(xié)議 以及 協(xié)議解析器 的實(shí)現(xiàn),若您對(duì)協(xié)議有所了解可以直接閱讀協(xié)議解析器部分,需要的朋友可以參考下2022-10-10
GoLand編寫 TCP 端口掃描器的詳細(xì)過(guò)程
TCP,也就是傳輸控制協(xié)議(Transmission Control Protocol),這篇文章主要介紹了Go語(yǔ)言(Golang)編寫 TCP 端口掃描器,需要的朋友可以參考下2023-05-05
Go語(yǔ)言使用select{}阻塞main函數(shù)介紹
這篇文章主要介紹了Go語(yǔ)言使用select{}阻塞main函數(shù)介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Go語(yǔ)言CSP并發(fā)模型實(shí)現(xiàn)MPG
這篇文章主要為大家介紹了Go語(yǔ)言CSP并發(fā)模型實(shí)現(xiàn)MPG圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05

