




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中太原一模試題及答案
- 六一測試題及答案
- 專業(yè)美術(shù)設(shè)計師考試試題及答案分享
- 中考政治歷史試題及答案
- 監(jiān)理模擬面試試題及答案
- 助理廣告師廣告?zhèn)鞑ピ囶}及答案匯編
- 商業(yè)美術(shù)設(shè)計師考試作品創(chuàng)作建議試題及答案
- 廚房小白測試題及答案
- 紡織品檢驗員證書的考試方法探討 試題及答案
- 《預(yù)應(yīng)力混凝土結(jié)構(gòu)設(shè)計》課件
- 高中音樂-《舞劇的靈魂》教學(xué)教學(xué)課件
- 林教頭風(fēng)雪山神廟【區(qū)一等獎】-完整版課件
- 兒童生長發(fā)育專項能力提升項目-初級結(jié)業(yè)考試卷
- 天津市新版就業(yè)、勞動合同登記名冊
- 改性環(huán)氧樹脂薄層鋪裝方案
- 產(chǎn)品追溯及模擬召回演練計劃
- 合同到期協(xié)議書(3篇)
- IPC-A-610國際標(biāo)準(zhǔn)中英文對照(doc 17)
- 山大《毛澤東思想和中國特色社會主義理論體系概論》教案第3章 社會主義改造理論
- 上海市高考語文備考之名著閱讀《紅樓夢》分章回練習(xí):第六回(無答案)
- 最新中建CI報價單-2013.
評論
0/150
提交評論