Reader) ReadBytes(delim ReadBytes读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的切片。如果ReadBytes方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadBytes方法返回的切片不以delim结尾时,会返回一个非nil的错误。
func (*Reader)ReadString
Reader) ReadString(delim byte) (line string,sans-serif; line-height:20px"> ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误。
func (*Reader)WriteTo
Reader) WriteTo(w io.Writer) (n int64,sans-serif; line-height:20px"> WriteTo方法实现了io.WriterTo接口。
2、Writer类型
// Writer 实现了带缓存的 io.Writer 对象
// 如果在向 Writer 中写入数据的过程中遇到错误
// 则 Writer 不会再接受任何数据
// 而且后续的写入操作都将返回错误信息
type Writer struct {
err error buf []byte n int wr io.Writer
}
example:
w := bufio.NewWriter(os.Stdout)
fmt.Fprint(w,"Hello,")
fmt.Fprint(w,"world!")
w.Flush() // Don't forget to flush!
2.1、Writer类型对应的方法
funcNewWriter
func NewWriter(w Writer) *Writer
NewWriter创建一个具有默认大小缓冲、写入w的*Writer。
funcNewWriterSize
func NewWriterSize(w Writer,171); text-decoration:none" rel="nofollow">int) *Writer
NewWriterSize创建一个具有最少有size尺寸的缓冲、写入w的*Writer。如果参数w已经是一个具有足够大缓冲的*Writer类型值,会返回w。
func (*Writer)func (b *Writer) Reset(w Writer)
Reset丢弃缓冲中的数据,清除任何错误,将b重设为将其输出写入w。
func (*Writer)Writer) Buffered() Buffered返回缓冲中已使用的字节数。
func (*Writer)Available
Writer) Available() Available返回缓冲中还有多少字节未使用。
func (*Writer)Write
Writer) Write(p []byte) (nn Write将p的内容写入缓冲。返回写入的字节数。如果返回值nn < len(p),还会返回一个错误说明原因。
func (*Writer)WriteString
Writer) WriteString(s string) ( WriteString写入一个字符串。返回写入的字节数。如果返回值nn < len(s),还会返回一个错误说明原因。
func (*Writer)WriteByte
Writer) WriteByte(c byte) WriteByte写入单个字节。
func (*Writer)WriteRune
Writer) WriteRune(r rune) (size WriteRune写入一个unicode码值(的utf-8编码),返回写入的字节数和可能的错误。
func (*Writer)Flush
Writer) Flush() Flush方法将缓冲中的数据写入下层的io.Writer接口。
func (*Writer)ReadFrom
Writer) ReadFrom(r Reader) (n ReadFrom实现了io.ReaderFrom接口。
3、ReadWriter类型
typeReadWriter
type ReadWriter struct {
*Reader
*Writer
}
ReadWriter类型保管了指向Reader和Writer类型的指针,(因此)实现了io.ReadWriter接口。
funcNewReadWriter
func NewReadWriter(r *Writer) *ReadWriter
NewReadWriter申请创建一个新的、将读写操作分派给r和w的ReadWriter。
4、SplitFunc类型
type SplitFunc func(data []bool) (advance error)
SplitFunc类型代表用于对输出作词法分析的分割函数。
参数data是尚未处理的数据的一个开始部分的切片,参数atEOF表示是否Reader接口不能提供更多的数据。返回值是解析位置前进的字节数,将要返回给调用者的token切片,以及可能遇到的错误。如果数据不足以(保证)生成一个完整的token,例如需要一整行数据但data里没有换行符,SplitFunc可以返回(0,nil,nil)来告诉Scanner读取更多的数据写入切片然后用从同一位置起始、长度更长的切片再试一次(调用SplitFunc类型函数)。
如果返回值err非nil,扫描将终止并将该错误返回给Scanner的调用者。
除非atEOF为真,永远不会使用空切片data调用SplitFunc类型函数。然而,如果atEOF为真,data却可能是非空的、且包含着未处理的文本。
4.1、SplitFunc类型的函数
funcScanBytes
func ScanBytes(data []error)
ScanBytes是用于Scanner类型的分割函数(符合SplitFunc),本函数会将每个字节作为一个token返回。
funcScanRunes
func ScanRunes(data [] ScanRunes是用于Scanner类型的分割函数(符合SplitFunc),本函数会将每个utf-8编码的unicode码值作为一个token返回。本函数返回的rune序列和range一个字符串的输出rune序列相同。错误的utf-8编码会翻译为U+FFFD = "xefxbfxbd",但只会消耗一个字节。调用者无法区分正确编码的rune和错误编码的rune。
funcScanWords
func ScanWords(data [] ScanRunes是用于Scanner类型的分割函数(符合SplitFunc),本函数会将空白(参见unicode.IsSpace)分隔的片段(去掉前后空白后)作为一个token返回。本函数永远不会返回空字符串。
funcScanLines
func ScanLines(data [] ScanRunes是用于Scanner类型的分割函数(符合SplitFunc),本函数会将每一行文本去掉末尾的换行标记作为一个token返回。返回的行可以是空字符串。换行标记为一个可选的回车后跟一个必选的换行符。最后一行即使没有换行符也会作为一个token返回。
5、Scanner类型
// Scanner 提供了一个方便的接口来读取数据,例如读取一个多行文本
// 连续调用 Scan 方法将扫描数据中的“指定部分”,跳过各个“指定部分”之间的数据
// Scanner 使用了缓存,所以“指定部分”的长度不能超出缓存的长度
// Scanner 需要一个 SplitFunc 类型的“切分函数”来确定“指定部分”的格式
// 本包中提供的“切分函数”有“行切分函数”、“字节切分函数”、“UTF8字符编码切分函数”
// 和“单词切分函数”,用户也可以自定义“切分函数”
// 默认的“切分函数”为“行切分函数”,用于获取数据中的一行数据(不包括行尾符)
//
// 扫描在遇到下面的情况时会停止:
// 1、数据扫描完毕,遇到 io.EOF
// 2、遇到读写错误
// 3、“指定部分”的长度超过了缓存的长度
// 如果要对数据进行更多的控制,比如的错误处理或扫描更大的“指定部分”或顺序扫描
// 则应该使用 bufio.Reader
type Scanner struct {
r io.Reader // The reader provided by the client.
split SplitFunc // The function to split the tokens.
maxTokenSize int // Maximum size of a token; modified by tests.
token []byte // Last token returned by split.
buf []byte // Buffer used as argument to split.
start int // First non-processed byte in buf.
end int // End of data in buf.
err error // Sticky error.
}
5.1、Scanner类型对应方法
funcNewScanner
func NewScanner(r Reader) *Scanner
NewScanner创建并返回一个从r读取数据的Scanner,默认的分割函数是ScanLines。
func (*Scanner)Split
func (s *Scanner) Split(split SplitFunc)
Split设置该Scanner的分割函数。本方法必须在Scan之前调用。
func (*Scanner)Scan
Scanner) Scan() bool
Scan方法获取当前位置的token(该token可以通过Bytes或Text方法获得),并让Scanner的扫描位置移动到下一个token。当扫描因为抵达输入流结尾或者遇到错误而停止时,本方法会返回false。在Scan方法返回false后,Err方法将返回扫描时遇到的任何错误;除非是io.EOF,此时Err会返回nil。
func (*Scanner)Bytes
Scanner) Bytes() []byte
Bytes方法返回最近一次Scan调用生成的token。底层数组指向的数据可能会被下一次Scan的调用重写。
func (*Scanner)Text
Scanner) Text() string
Bytes方法返回最近一次Scan调用生成的token,会申请创建一个字符串保存token并返回该字符串。
func (*Scanner)Err
Scanner) Err() Err返回Scanner遇到的第一个非EOF的错误。
5.2、使用例子
// An artificial input source.
const input = "1234 5678 1234567901234567890"
scanner := bufio.NewScanner(strings.NewReader(input))
// Create a custom split function by wrapping the existing ScanWords function.
split := func(data []byte,atEOF bool) (advance int,token []byte,err error) {
advance,token,err = bufio.ScanWords(data,atEOF)
if err == nil && token != nil {
_,err = strconv.ParseInt(string(token),10,32)
}
return
}
// Set the split function for the scanning operation.
scanner.Split(split)
// Validate the input
for scanner.Scan() {
fmt.Printf("%sn",scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Printf("Invalid input: %s",err)
}
Output:
1234
5678
Invalid input: strconv.ParseInt: parsing "1234567901234567890": value out of range
Example (Lines)
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text()) // Println will add back the final 'n'
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr,"reading standard input:",err)
}
Example (Words)
// An artificial input source.
const input = "Now is the winter of our discontent,nMade glorious summer by this sun of York.n"
scanner := bufio.NewScanner(strings.NewReader(input))
// Set the split function for the scanning operation.
scanner.Split(bufio.ScanWords)
// Count the words.
count := 0
for scanner.Scan() {
count++
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr,"reading input:",err)
}
fmt.Printf("%dn",count)
Output:
15
参考
http://studygolang.com/pkgdoc
http://studygolang.com/articles/4367
http://www.cnblogs.com/golove/p/3282667.html
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!