我想从同一阅读器r
创建2个扫描仪。但是,当从第一个扫描程序调用{{1}}时,它会从Scan()
释放缓冲区,因此第二个扫描程序正在读取零缓冲区。这是常见的行为吗?如何解决该问题,以便第二台扫描仪正确读取原始的r
?
r
这里是play golang
的示例这就是我要执行的操作:从文件中读取特定行,但是当第二次调用该函数时,r := bytes.NewReader([]byte("ninebytes"))
fmt.Println(r.Len()) // 9
sc1 := bufio.NewScanner(r)
sc1.Scan()
fmt.Printf("scanner1: %s\n", sc1.Text()) // scanner1: ninebytes
// i want create new scanner from r too
fmt.Println(r.Len()) // 0
sc2 := bufio.NewScanner(r)
sc1.Scan()
fmt.Printf("scanner2: %s\n", sc2.Text()) // scanner2:
耗尽了。
r
答案 0 :(得分:0)
阅读读者通常是一种破坏性的行为。尤其是http请求正文。
相反,您可以创建一个以Unix tee
命令为模型的T型阅读器。
修改您给出的示例:
r := bytes.NewReader([]byte("ninebytes"))
var buf bytes.Buffer
tee := io.TeeReader(r, &buf)
sc1 := bufio.NewScanner(tee)
sc1.Scan()
fmt.Printf("scanner1: %s\n", sc1.Text())
sc2 := bufio.NewScanner(&buf)
sc2.Scan()
fmt.Printf("scanner2: %s\n", sc2.Text())
使用三通阅读器,当您从r
中读取内容时,会将这些字节的副本写入buf
,您可以在第二个扫描器中再次使用它。