Go语言程序设计(十四)数据I/O对象及操作

这篇具有很好参考价值的文章主要介绍了Go语言程序设计(十四)数据I/O对象及操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、ReadWriter对象

ReadWriter对象可以对数据I/O接口io.ReadWriter进行输入输出缓冲操作,其结构定义如下:

type ReadWriter struct{
    * Reader
    * Writer
}

        默认情况下,ReadWriter对象中存放了一对Reader和Writer指针,它同时提供了对数据I/O对象的读写缓冲功能。
        可以使用NewReadWriter()函数创建ReadWriter对象,该函数的功能是根据指定的Reader和Writer 创建一个ReadWriter 对象,ReadWriter对象将会向底层io.ReadWriter接口写入数据,或者从io.ReadWriter接口读取数据。

该函数原型声明如下:

func NewReadWriter(r * Reader, w * Writer) * ReadWriter

        在函数NewReadWriter()中,参数r是要读取的来源Reader对象;参数w是要写入的目的Writer对象。

二、Reader对象

        Reader对象可以对数据I/O接口io.Reader进行输入缓冲操作,Reader结构定义如下:

type Reader struct {
    // contains filtered or unexported fields
}

        默认情况下Reader 对象没有定义初始值,输入缓冲区最小值为16。当超出限制时,另创建一个二倍的存储空间。

1、Reader对象创建函数

(1)NewReader():按照缓冲区默认长度创建Reader对象,Reader对象会从底层io.Reader接口读取尽量多的数据进行缓存。该函数声明如下:

func NewReader(rd io.Reader) * Reader

(2)NewReaderSize():按照指定的缓冲区长度创建Reader对象Reader对象会从底层io.Reader接口读取尽量多的数据进行缓存。该函数声明如下(其中size是缓冲区字节长度):

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

2、Reader对象操作方法

(1)Read()方法。功能是读取数据,并存放到字节切片p中,执行结束会返回已读取的字节数。因为最多只调用一次底层的io.Reader,所以返回的 n可能小于len(p);当字节流结束时,n为0,err为io.EOF。

(2)ReadByte()方法。ReadByte()方法的功能是读取并返回一个字节。如果没有字节可读,则返回错误信息。

(3)ReadBytes()方法。ReadBytes()方法的功能是ReadBytes读取数据直到遇到第一个分隔符“delim”,并返回读取的字节序列(包括“delim”)。如果ReadBytes在读到第一个“delim"之前出错,它返回已读取的数据和那个错误(通常是io.EOF)。只有当返回的数据不以“delim”结尾时,返回的err才不为空值。

(4)ReadLine()方法。ReadLine()方法是一个低级的用于读取一行数据的原语,大多数调用者应该使用ReadBytes( '\n')或者ReadString('\n')。ReadLine 试图返回一行,不包括结尾的回车字符。如果一行太长了(超过缓冲区长度),参数isPrefix会设置为true并且只返回前面的数据,剩余的数据会在以后的调用中返回。当返回最后一行数据时,参数isPrefix会置为false.返回的字节切片只在下一次调用ReadLine前有效。ReadLine 或者返回一个非空的字节切片或者返回一个错误,但它们不会同时返回。

(5)ReadRune()方法。ReadRune()方法的功能是读取一个UTF-8编码的字符,并返回其Unicode编码和字节数。如果编码错误,ReadRune只读取一个字节并返回unicode.ReplacementChar(U+ FFFD)和长度1。

(6)ReadSlice()方法。ReadSlice()方法的功能是读取数据直到分隔符“delim"处,并返回读取数据的字节切片,下次读取数据时返回的切片会失效。如果ReadSlice 在查找到“delim"之前遇到错误,它返回读取的所有数据和那个错误(通常是io.EOF)。如果缓冲区满时也没有查找到“delim",则返回ErrBufferFull错误。因为ReadSlice返回的数据会在下次I/O操作时被覆盖,大多数调用者应该使用ReadBytes或者ReadString。只有当line不以“delim"结尾时,ReadSlice才会返回非空err。

(7)ReadString() 方法。ReadString()方法的功能是读取数据直到分隔符“delim"第一次出现,并返回一个包含“delim”的字符串。如果ReadString在读取到“delim"前遇到错误,它返回已读字符串和那个错误(通常是io.EOF)。只有当返回的字符串不以“delim”结尾时, ReadString才返回非空err。

(8)UnreadByte()方法。UnreadByte()方法的功能是UnreadByte取消已读取的最后一个字节(即把字节重新放回读取缓冲区的前部)。只有最近一次读取的单个字节才能取消读取。

(9)UnreadRune()方法。UnreadRune()方法的功能是UnreadRune取消读取最后一次读取的Unicode字符。如果最后一次读取操作不是ReadRune,UnreadRune会返回一个错误(在这方面它比UnreadByte更严格,因为UnreadByte会取消上次任意读操作的最后一个字节)。

(10)Buffered()方法。Buffered()方法的功能是返回可从缓冲区读出数据的字节数。

(11)Peek()方法。Peek()方法的功能是读取指定字节数的数据,这些被读取的数据不会从缓冲区中清除。在下次读取之后,本次返回的字节切片会失效。如果Peek返回的字节数不足n字节,则会同时返回一个错误说明原因;如果n比缓冲区要大,则错误为ErrBufferFull。

三、Writer对象

        Writer对象可以对数据I/O接口io.Writer进行输出缓冲操作, Writer结构定义如下:

type Writer struct {
    // contains filtered or unexported fields
}

        默认情况下Writer对象没有定义初始值,如果输出缓冲过程中发生错误,则数据写入操作立刻被终止,后续的写操作都会返回写入异常错误。

1、Writer对象创建函数

(1)New Writer()函数。NewWriter() 函数的功能是按照默认缓冲区长度创建Writer对象,Writer对象会将缓存的数据批量写入底层io.Writer接口。该函数原型声明如下:

func NewWriter(wr io.Writer) * Writer

在函数NewWriter()中,参数wr是io. Writer接口,Writer对象会将数据写入该接口。

(2)NewWriterSize()函数。NewWriterSize()函数的功能是按照指定的缓冲区长度创建Writer对象, Writer对象会将缓存的数据批量写入底层io.Writer接口。该函数原型声明如下:

func NewWriterSize(wr io.Writer, size int) * Writer

在函数NewWriterSize()中,参数wr是io. Writer接口;参数size是指定的缓冲区字节长度。

2、Writer对象操作方法

(1)Available()方法。Available()方法的功能是返回缓冲区中未使用的字节数。

(2)Buffered()方法。Buffered()方法的功能是返回已写入当前缓冲区中的字节数。

(3)Flush()方法。Flush()方法的功能是把缓冲区中的数据写入底层的io.Writer,并返回错误信息。如果成功写入,error返回nil;否则,error返回错误原因。

(4)Write()方法。Write()方法的功能是把字节切片p写入缓冲区,返回已写入的字节数nn。如果nn小于len(p),则同时返回一个错误原因。

(5)WriteByte()方法。WriteByte()方法的功能是写入一个字节,如果成功写入,error返回nil;否则,error返回错误原因。

(6)WriteRune()方法。WriteRune() 方法的功能是以UTF-8编码写入一个Unicode字符,返回写入的字节数和错误信息。

(7)WriteString()方法。Writetring()方法的功能是写入一个字符串,并返回写入的字节数和错误信息。如果返回的字节数小于len(s) ,则同时返回一个错误说明原因。文章来源地址https://www.toymoban.com/news/detail-542012.html

到了这里,关于Go语言程序设计(十四)数据I/O对象及操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包