golang的io.copy使用
本文内容纲要:
-net/http下载
-io.copy
net/http下载
在golang中,如果我们要下载一个文件,最简单的就是先用http.get()方法创建一个远程的请求后,后面可使用ioutil.WriteFile()等将请求内容直接写到文件中。
funcDownFile(){
url:="http://wx.qlogo.cn/Vaz7vE1/64"
resp,err:=http.Get(url)
iferr!=nil{
fmt.Fprint(os.Stderr,"geturlerror",err)
}
deferresp.Body.Close()
data,err:=ioutil.ReadAll(resp.Body)
iferr!=nil{
panic(err)
}
_=ioutil.WriteFile("/tmp/icon_wx.png",data,0755)
}
但是你会发现,上面的操作方式会有一个小问题,那就是下载小文件还行,如果是大的文件的话,可能会出现内存不足的问题,因为它是需要先把请求内容全部读取到内存中,然后再写入到文件中的。
那如果要下载大文件或者复制大文件,应该怎么办呢?其实,Golang中就提供了io.copy
方法,它就是在文件指针之间直接复制的,不用全读入内存,可解决这样的问题。
io.copy
我们先看下原型声明
funcCopy(dstWriter,srcReader)(writtenint64,errerror){
returncopyBuffer(dst,src,nil)
}
funccopyBuffer(dstWriter,srcReader,buf[]byte)(writtenint64,errerror){
....
ifbuf==nil{
size:=32*1024
ifl,ok:=src.(*LimitedReader);ok&&int64(size)>l.N{
ifl.N<1{
size=1
}else{
size=int(l.N)
}
}
buf=make([]byte,size)
}
它是将源复制到目标,并且是按默认的缓冲区32k循环操作的,不会将内容一次性全写入内存中,这样就能解决大文件的问题。
我们再用io.copy
来实现一下吧。
funcDownFile(){
url:="http://wx.qlogo.cn/Vaz7vE1/64"
resp,err:=http.Get(url)
iferr!=nil{
fmt.Fprint(os.Stderr,"geturlerror",err)
}
deferresp.Body.Close()
out,err:=os.Create("/tmp/icon_wx_2.png")
wt:=bufio.NewWriter(out)
deferout.Close()
n,err:=io.Copy(wt,resp.Body)
fmt.Println("write",n)
iferr!=nil{
panic(err)
}
wt.Flush()
}
同理,如果我们要复制大文件也可以用io.copy
这个,防止产生内存溢出。
本文内容总结:net/http下载,io.copy,
原文链接:https://www.cnblogs.com/smartrui/p/12110576.html