缓冲区大小
bufio
包中的 Reader
和 Writer
对象都有一个缓冲区,缓冲区大小默认为 4096 字节。我们可以使用 bufio.NewReaderSize()
和 bufio.NewWriterSize()
函数来创建指定大小的缓冲区。下面是一个示例:
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
str := "Hello, World!n"
reader := bufio.NewReaderSize(strings.NewReader(str), 16)
for {
line, err := reader.ReadString('n')
if err != nil {
break
}
fmt.Print(line)
}
}
在上面的示例代码中,我们使用 bufio.NewReaderSize()
函数创建了一个缓冲区大小为 16 字节的 bufio.Reader
对象。其他操作和前面的示例一样。
读取和写入字节
除了 ReadString()
和 Fprintln()
方法之外,bufio
包还提供了一些其他的方法用于读取和写入字节。下面是一些示例:
package main
import (
"bufio"
"bytes"
"fmt"
"os"
)
func main() {
// 读取字节
str := "Hello, World!n"
reader := bytes.NewReader([]byte(str))
bufReader := bufio.NewReader(reader)
for {
b, err := bufReader.ReadByte()
if err != nil {
break
}
fmt.Printf("%c", b)
}
// 写入字节
file, err := os.Create("output.txt")
if err != nil {
panic(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
for i := 1; i <= 100; i {
writer.WriteByte(byte(i))
}
writer.Flush()
}
在上面的示例代码中,我们使用 bytes.NewReader()
函数创建了一个 io.Reader
对象,然后使用 bufio.NewReader()
函数创建了一个 bufio.Reader
对象,并将其包装了 io.Reader
对象。接着,我们使用 ReadByte()
方法逐个字节地读取数据,并打印出来。最后,我们使用 WriteByte()
方法将数字 1 到 100 写入缓冲区中,并使用 Flush()
方法将缓冲区中的数据一次性写入文件中。
Scanner
bufio
包还提供了一个 Scanner
类型,它可以方便地从输入流中读取数据,并将其分隔成多个 token,逐个返回。下面是一个示例:
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
str := "1 2 3n4 5 6n"
reader := bufio.NewReader(strings.NewReader(str))
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
line := scanner.Text()
fmt.Println(line)
}
}
在上面的示例代码中,我们使用 bufio.NewScanner()
函数创建了一个 bufio.Scanner
对象,并将其包装了 bufio.Reader
对象。然后,我们使用 Scan()
方法逐个读取输入流中的 token,并打印出来。