一文詳解golang通過io包進行文件讀寫_第1頁
一文詳解golang通過io包進行文件讀寫_第2頁
一文詳解golang通過io包進行文件讀寫_第3頁
一文詳解golang通過io包進行文件讀寫_第4頁
一文詳解golang通過io包進行文件讀寫_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第一文詳解golang通過io包進行文件讀寫funccopyBuffer(dstWriter,srcReader,buf[]byte)(writtenint64,errerror){

//IfthereaderhasaWriteTomethod,useittodothecopy.

//Avoidsanallocationandacopy.

ifwt,ok:=src.(WriterTo);ok{//源實現(xiàn)了writeTo就可以直接調(diào)用結(jié)束

returnwt.WriteTo(dst)

//Similarly,ifthewriterhasaReadFrommethod,useittodothecopy.

ifrt,ok:=dst.(ReaderFrom);ok{//目標(biāo)實現(xiàn)了readFrom,也可以直接調(diào)用結(jié)束

returnrt.ReadFrom(src)

ifbuf==nil{

size:=32*1024

ifl,ok:=src.(*LimitedReader);okint64(size)l.N{

ifl.N1{

size=1

}else{

size=int(l.N)

buf=make([]byte,size)//buf空時,創(chuàng)建buf

//開啟循環(huán)內(nèi)容讀取

for{

nr,er:=src.Read(buf)//從源中讀取內(nèi)容到buf中

ifnr0{

nw,ew:=dst.Write(buf[0:nr])//目標(biāo)w從buf中寫入內(nèi)容

ifnw0||nrnw{

nw=0

ifew==nil{

ew=errInvalidWrite

written+=int64(nw)//更新寫入長度

ifew!=nil{//寫入返回err,退出循環(huán)

err=ew

break

ifnr!=nw{//讀取與寫入長度不等,退出

err=ErrShortWrite

break

ifer!=nil{//讀err非空,退出

ifer!=EOF{

err=er

break

returnwritten,err//返回寫入長度及err

}

通過源碼走讀,我們可以看到,在函數(shù)中傳入Writer作為目標(biāo)寫入對象,傳入Reader作為源讀取對象,如果Reader對象實現(xiàn)WriteTo方法,我們可以直接調(diào)用此完成copy,或者是Writer對象實現(xiàn)了ReadFrom方法,我們可以直接調(diào)用此完成copy,都沒有實現(xiàn),就只有通過buf作為中轉(zhuǎn),通過循環(huán),先從源讀取內(nèi)容,再寫入目標(biāo)對象中,最后返回整個內(nèi)容的長度,當(dāng)然其中也有相關(guān)錯誤處理,這里不做討論。

接下來io包中提供的另外的寫入操作實現(xiàn):

//io.WriteString()

funcWriteString(wWriter,sstring)(nint,errerror){

ifsw,ok:=w.(StringWriter);ok{//如w實現(xiàn)了StringWriter,則調(diào)用相關(guān)方法實現(xiàn)寫入

returnsw.WriteString(s)

returnw.Write([]byte(s))//作為兜底,w對象是肯定實現(xiàn)了Write()方法,所以調(diào)用此方法實現(xiàn)寫入

}

從上面代碼可以看到,該實現(xiàn)邏輯簡單,具體見注釋。

io包實現(xiàn)讀寫操作準(zhǔn)備:

file.txt,作為讀取源,然后再寫入其他文件中寫操作,我們實現(xiàn)了2種,一種io.Copy(),一種io.WriteString(),具體使用見下面代碼:

funcioRW(){

//read

f,err:=os.Open("D:\\demo1\\src\\demo23\\go-io\\file\\file.txt")

deferf.Close()

iferr!=nil{

fmt.Printf("err:%s\n",err)

return

b,err:=io.ReadAll(f)

iferr!=nil{

fmt.Printf("err:%s\n",err)

return

fmt.Printf("ioRWreadcontent:\n%s\n",b)

//write

//1.io.Copy()

fw,err:=os.Create("io_w.txt")

deferfw.Close()

n,err:=io.Copy(fw,strings.NewReader(string(b)))

iferr!=nil{

fmt.Printf("err:%s\n",err)

return

//2.io.WriteString()

fw_1,_:=os.Create("io_w_1.txt")

deferfw_1.Close()

n,err:=io.WriteString(fw_1,string(b))

iferr!=nil{

fmt.Printf("err:%s\n",err)

return

fmt.Printf("ioRWwritesize:%d\n",n)

}

2.io.ioutil包實現(xiàn)讀寫操作

所謂util,肯定是作為工具使用,怎么方便怎么來,我們甚至通過文件名就可以完成操作,具體實現(xiàn)細(xì)節(jié)我們不關(guān)心,總之它實現(xiàn)了這些功能。

注意由于我使用的go1.19,在源碼中,明確聲明在go1.16后,逐漸棄用了,所以使用高版本的go時要注意這個問題,這里為了增加源碼的了解熟悉,也拿出來作為分享。

讀操作

//Deprecated:AsofGo1.16,thisfunctionsimplycallsio.ReadAll.

funcReadAll(rio.Reader)([]byte,error){

returnio.ReadAll(r)

//Deprecated:AsofGo1.16,thisfunctionsimplycallsos.ReadFile.

funcReadFile(filenamestring)([]byte,error){

returnos.ReadFile(filename)

}

在ReadAll中,實際也是調(diào)用上面的io.ReadAll(),這里不贅述,在ReadFile中,我們傳入個文件名,就可以讀取到整個字節(jié)內(nèi)容,實際它也是調(diào)用os.ReadFile()實現(xiàn),后面再討論os包。

寫操作

//Deprecated:AsofGo1.16,thisfunctionsimplycallsos.WriteFile.

funcWriteFile(filenamestring,data[]byte,permfs.FileMode)error{

returnos.WriteFile(filename,data,perm)

}

可以看到,這里也是調(diào)用了os.WriteFile()實現(xiàn)文件的寫入,只需要我們傳入待寫入的文件名,寫入的字節(jié)數(shù)組,以及寫入文件的權(quán)限,是不是很簡單。

代碼實用

funcioutilRW(){

//read

b,err:=ioutil.ReadFile("D:\\demo1\\src\\demo23\\go-io\\file\\file.txt")

iferr!=nil{

fmt.Printf("err:%s\n",err)

return

fmt.Printf("ioutilRWreadcontent:\n%s\n",b)

//write

err=ioutil.WriteFile("ioutilRW_w.txt",b,664)

iferr!=nil{

fmt.Printf("err:%s\n",err)

return

fmt.Println("iou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論