Peek与ioutil的问题

来源:15-1 获得初始页面内容

chenjianyun

2021-05-20

图片描述
这里在做过Peek操作后,再用ioutil.ReadAll()去读取,会少读1024个;
可以用buio来解决

写回答

2回答

爱吃apple的阿狸

2021-09-05

peek方法的注释 :

//Peek返回接下来的n个字节,而不推进读取器。字节停止

//在下一次读取调用时有效。


我感觉这里下一次读取,是指下一次读取该bufio.reader

视频里在determineEcoding方法里,bufio.newReader()方法后,直接调用peek()方法,实际上这里调用者是bufio.reader,但是外面ioutil.readAll读取的是之前的resp.body。


简单的解决方法是determineEncoding方法,把bufio.reader返回出去,ioutil.ReadAll读返回的reader,就不会丢失1024了

虽然我也不懂,感觉是bufio.reader使用了peek()方法,后续必须使用bufio的reader再读才不会出错

func main() {
   response, err := http.Get("http://localhost:8080/mock/www.zhenai.com/zhenghun")
   if err != nil {
      panic(err)
   }
   defer response.Body.Close()

   if response.StatusCode != http.StatusOK {
      fmt.Println("status error:", response.StatusCode)
   }

   reader, e := determineEncoding(response.Body)
   reader = transform.NewReader(reader, e.NewDecoder())

   all, err := ioutil.ReadAll(reader)
   if err != nil {
      panic(err)
   }

   fmt.Printf("%s", all)
}

func determineEncoding(r io.Reader) (io.Reader, encoding.Encoding) {
   br := bufio.NewReader(r)
   bytes, err := br.Peek(1024)
   if err != nil {
      panic(err)
   }
   e, _, _ := charset.DetermineEncoding(bytes, "")
   return br, e
}


3
0

ccmouse

2021-06-13

的确是这样的。某种程度来说用bufio更好。同学不妨贴出解决的方案。

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程