建立一個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
*/
}