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()
    It's a lonely road!!!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号