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 }
30 -
ccmouse
2021-06-13
的确是这样的。某种程度来说用bufio更好。同学不妨贴出解决的方案。
00
相似问题