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
	*/
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章