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