天天看點

golang bufio包Reader類型方法測試例子

建立一個bufio.Reader類型的方法

func NewReader(rd io.Reader) *Reader
           

Read

聲明

func (b *Reader) Read(p []byte) (n int, err error)
           

作用

Read讀取資料寫入p。本方法傳回寫入p的位元組數。本方法一次調用最多會調用下層Reader接口一次Read方法,是以傳回值n可能小于len(p)。讀取到達結尾時,傳回值n将為0而err将為io.EOF。

例子

func main(){
	str_alp := "abcdefghijklmnopqrstuvwxyz"
	byte_len_5 := make([]byte,5)
	rd_alp := strings.NewReader(str_alp)
	buf_rd := bufio.NewReader(rd_alp)
	n,_ := buf_rd.Read(byte_len_5)
	fmt.Println("讀取到的内容長度",n)
	fmt.Println("讀取到的内容",string(byte_len_5))
	n,_ = buf_rd.Read(byte_len_5)
	fmt.Println("讀取到的内容長度",n)
	fmt.Println("讀取到的内容",string(byte_len_5))
	/*
	* 輸出
	讀取到的内容長度 5
	讀取到的内容 abcde
	讀取到的内容長度 5
	讀取到的内容 fghij
	*/
}
           
func main(){
	str_alp := "abcdefghijklmnopqrstuvwxyz"
	byte_len_26 := make([]byte,26)
	rd_alp := strings.NewReader(str_alp)
	buf_rd := bufio.NewReader(rd_alp)
	n,_ := buf_rd.Read(byte_len_26)
	fmt.Println("讀取到的内容長度",n)
	fmt.Println("讀取到的内容",string(byte_len_26))
	//上一步Read方法讀取了所有的内容,此次Read将讀取到結尾符
	n,err := buf_rd.Read(byte_len_26)
	if n == 0 && err == io.EOF{
		fmt.Println("已讀取完畢")
	}
	/*
	* 輸出
	讀取到的内容長度 26
	讀取到的内容 abcdefghijklmnopqrstuvwxyz
	已讀取完畢
	*/
}
           

ReadByte

聲明

func (b *Reader) ReadByte() (c byte, err error)
           

作用

ReadByte讀取并傳回一個位元組。如果沒有可用的資料,會傳回錯誤。

例子

func main(){
	str_alp := "ab"
	rd_alp := strings.NewReader(str_alp)
	buf_rd := bufio.NewReader(rd_alp)
	c,_ := buf_rd.ReadByte()
	fmt.Println("讀取到的内容",string(c))
	c,_ = buf_rd.ReadByte()
	fmt.Println("讀取到的内容",string(c))
	_,err := buf_rd.ReadByte()
	if err != nil{
			fmt.Println(err)
	}
	/*
	* 輸出
	讀取到的内容 a
	讀取到的内容 b
	EOF
	*/
}
           

UnreadByte

聲明

func (b *Reader) UnreadByte() error
           

作用

UnreadByte吐出最近一次讀取操作讀取的最後一個位元組。(隻能吐出最後一個,多次調用會出問題)

例子

func main(){
	str_alp := "abc"
	rd_alp := strings.NewReader(str_alp)
	buf_rd := bufio.NewReader(rd_alp)
	byte_len_2 := make([]byte,2)
	buf_rd.Read(byte_len_2)
	fmt.Println(string(byte_len_2))
	//復原一個位元組
	buf_rd.UnreadByte()
	//多次復原會報錯,最多隻能復原一次
	err := buf_rd.UnreadByte()
	if err != nil{
		fmt.Println(err)
	}
	c,_ := buf_rd.ReadByte()
	fmt.Println(string(c))
	/*
	* 輸出
	ab
	bufio: invalid use of UnreadByte
	b
	*/
}
           

Peek

聲明

func (b *Reader) Peek(n int) ([]byte, error)
           

作用

Peek傳回輸入流的下n個位元組,而不會移動讀取位置。傳回的[]byte隻在下一次調用讀取操作前合法。如果Peek傳回的切片長度比n小,它也會返會一個錯誤說明原因。如果n比緩沖尺寸還大,傳回的錯誤将是ErrBufferFull。

例子

func main(){
	str_alp := "abcde"
	rd_alp := strings.NewReader(str_alp)
	buf_rd := bufio.NewReader(rd_alp)
	byte_len_2 := make([]byte,2)
	buf_rd.Read(byte_len_2)
	fmt.Println("Read讀取到的資訊:",string(byte_len_2))
	//傳回輸入流的下n個位元組
	p1,_ := buf_rd.Peek(2)
	fmt.Println("Peek讀取到的資訊",string(p1))
	//Peek讀取的不影響Read讀取的偏移位
	buf_rd.Read(byte_len_2)
	fmt.Println("Read讀取到的資訊",string(byte_len_2))
	//讀取到的内容,少于peek希望傳回的位元組數
	p2,err := buf_rd.Peek(10)
	if err != nil{
		fmt.Println(err)
	}
	fmt.Println("Peek讀取到的資訊",string(p2))
	/*
	* 輸出
	Read讀取到的資訊: ab
	Peek讀取到的資訊 cd
	Read讀取到的資訊 cd
	EOF
	Peek讀取到的資訊 e
	*/
}
           

ReadLine

聲明

func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
           

作用

ReadLine嘗試傳回一行資料,不包括行尾标志的位元組。如果行太長超過了緩沖,傳回值isPrefix會被設為true,并傳回行的前面一部分。該行剩下的部分将在之後的調用中傳回。傳回值isPrefix會在傳回該行最後一個片段時才設為false。傳回切片是緩沖的子切片,隻在下一次讀取操作之前有效。ReadLine要麼傳回一個非nil的line,要麼傳回一個非nil的err,兩個傳回值至少一個非nil。

傳回的文本不包含行尾的标志位元組("\r\n"或"\n")。如果輸入流結束時沒有行尾标志位元組,方法不會出錯,也不會指出這一情況。在調用ReadLine之後調用UnreadByte會總是吐出最後一個讀取的位元組(很可能是該行的行尾标志位元組),即使該位元組不是ReadLine傳回值的一部分。

例子

func main(){
	str_alp := "abc\ndef\r\nhi"
	rd_alp := strings.NewReader(str_alp)
	buf_rd := bufio.NewReader(rd_alp)
	rd_ln_bytes, _ , _  := buf_rd.ReadLine()
	fmt.Println("讀取到一行",string(rd_ln_bytes))
	rd_ln_bytes, _ , _  = buf_rd.ReadLine()
	fmt.Println("讀取到一行",string(rd_ln_bytes))
	rd_ln_bytes, _ , _  = buf_rd.ReadLine()
	fmt.Println("讀取到一行",string(rd_ln_bytes))
	/*
	* 輸出
	Read讀取到的資訊: ab
	Peek讀取到的資訊 cd
	Read讀取到的資訊 cd
	EOF
	Peek讀取到的資訊 e
	*/
}
           

ReadBytes

聲明

func (b *Reader) ReadBytes(delim byte) (line []byte, err error)
           

作用

ReadBytes讀取直到第一次遇到delim位元組,傳回一個包含已讀取的資料和delim位元組的切片。如果ReadBytes方法在讀取到delim之前遇到了錯誤,它會傳回在錯誤之前讀取的資料以及該錯誤(一般是io.EOF)。當且僅當ReadBytes方法傳回的切片不以delim結尾時,會傳回一個非nil的錯誤。

例子

func main(){
	str_alp := "abcdefck"
	rd_alp := strings.NewReader(str_alp)
	buf_rd := bufio.NewReader(rd_alp)
	//讀取到第一次出現c的位元組截止,傳回内容包含c
	line,_ := buf_rd.ReadBytes('c')
	fmt.Println(string(line))
	//截至到不存在的位元組,傳回io.EOF錯誤
	line,err := buf_rd.ReadBytes('z')
	if err != nil{
		fmt.Println(err)
	}
	fmt.Println(string(line))
	/*
	* 輸出
	abc
	EOF
	defck
	*/
}