1.24 Go之数据I/O对象及操作

1.24 Go之数据I/O对象及操作

Go语言实现基本I/O操作的包

Go语言标准库的 bufio 包中,实现了对数据 I/O 接口的缓冲功能

特点:

封装于接口 io.ReadWriter、io.Reader 和 io.Writer 中,并对应创建了 ReadWriter、Reader 或 Writer 对象,在提供缓冲的同时实现了一些文本基本 I/O 操作功能。

Go的数据核心:

接口是Go语言中所有数据结构的核心。

对象介绍

ReadWriter对象

ReadWriter结构定义:

package practice_interface

import "bufio"

/*
ReadWriter结构定义
*/
type ReadWriter struct {
   // Read指针
   *bufio.Reader

   // Writer指针
   *bufio.Writer
}

两个指针提供了对数据I/O对象的读写缓冲功能

创建ReadWriter对象使用函数--->NewReadWriter()指定Read或者Writer创建一个ReadWriter对象,

ReadWriter 对象将会向底层 io.ReadWriter 接口写入数据,或者从 io.ReadWriter 接口读取数据

func NewReadWriter(r *bufio.Reader, w *bufio.Writer) *ReadWriter {
   return nil
}

创建Reader对象

创建Reader对象的函数:

  • NewReader()函数

  • NewReaderSize()函数

NewReader()函数按照缓冲区默认长度创造Reader对象。从底层接口读取尽量多的数据进行缓存。

func NewReader(rd io.Reader) *Reader

NewReaderSize()函数可以自定义缓冲区字节长度。

func NewReaderSize(rd io.Reader, size int) *Reader

操作Reader对象的方法

Read()读取数据,并存放到字节切片 p 中。返回已读取的字节数。
ReadByte() 读取并返回一个字节,如果没有字节可读,则返回错误信息--->修改调用方法即可
ReadBytes() 读取数据直到遇到第一个分隔符“delim”,并返回读取的字节序列(包括“delim”)。ReadBytes在读到第一个“delim”之前出错,它返回已读取的数据和那个错误
ReadLine() 读取一行数据,如果一行太长(超过缓冲区长度),参数 isPrefix 会设置为 true 并且只返回前面的数据,剩余的数据会在以后的调用中返回。
ReadRune() 读取一个 UTF-8 编码的字符,并返回其 Unicode 编码和字节数。如果编码错误,ReadRune 只读取一个字节并返回 unicode.ReplacementChar(U+FFFD) 和长度 1
ReadSlice() 读取数据直到分隔符“delim”处,并返回读取数据的字节切片,下次读取数据时返回的切片会失效。如果ReadSlice在查找到“delim”之前遇到错误,它返回读取的所有数据和那个错误
ReadString() 读取数据直到分隔符“delim”第一次出现,并返回一个包含“delim”的字符串。如果 ReadString 在读取到“delim”前遇到错误,它返回已读字符串和那个错误(通常是 io.EOF)。只有当返回的字符串不以“delim”结尾时,ReadString 才返回非空 err
UnreadByte() 取消已读取的最后一个字节(即把字节重新放回读取缓冲区的前部)。只有最近一次读取的单个字节才能取消读取
UnreadRune() 取消读取最后一次读取的 Unicode 字符。如果最后一次读取操作不是 ReadRune,UnreadRune 会返回一个错误(在这方面它比 UnreadByte 更严格,因为 UnreadByte 会取消上次任意读操作的最后一个字节)
Buffered() 返回可从缓冲区读出数据的字节数
Peek() 读取指定字节数的数据,这些被读取的数据不会从缓冲区中清除。在下次读取之后,本次返回的字节切片会失效。如果 Peek 返回的字节数不足 n 字节,则会同时返回一个错误说明原因,如果 n 比缓冲区要大,则错误为 ErrBufferFull
Reader()方法

特点:

最多只调用底层的 io.Reader 一次,所以返回的 n 可能小于 len(p),当字节流结束时,n 为 0,err 为 io. EOF

func (b *Reader) Read(p []byte) (n int, err error)

示例:

package practice_interface

import (
   "bufio"
   "bytes"
   "fmt"
)

func main() {
   // 声明字节数组
   data := []byte("JunkingBoy")

   // 新建newreader对象
   re := bytes.NewReader(data)

   // 构建readerwriter对象
   r := bufio.NewReader(re)

   //由于read方法返回的是字节切片长度,所以新建字节切片对象
   var buf [128]byte

   // 调用reader对象的read方法
   n, err := r.Read(buf[:])

   fmt.Println(string(buf[:n]), n, err)
}
Writer()方法

方法名和上面的Reader()方法对应,只是对象变味了Writer()对象

posted @   俊king  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示