Go-标准库-bufio(二)

2023-04-22 08:59:03 浏览数 (1)

缓冲区大小

bufio 包中的 ReaderWriter 对象都有一个缓冲区,缓冲区大小默认为 4096 字节。我们可以使用 bufio.NewReaderSize()bufio.NewWriterSize() 函数来创建指定大小的缓冲区。下面是一个示例:

代码语言:javascript复制
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 包还提供了一些其他的方法用于读取和写入字节。下面是一些示例:

代码语言:javascript复制
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,逐个返回。下面是一个示例:

代码语言:javascript复制
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,并打印出来。

go

0 人点赞