strings.NewReader 与 bufio.NewReader

最近看golang bufio包时,有注意到strings.NewReader 与 bufio.NewReader这两个方法,那么这两个都是做什么用的呢?

strings.NewReader 注意看这个方法的内容

//reader包中 Reader 结构体
// A Reader implements the io.Reader, io.ReaderAt, io.Seeker, io.WriterTo,
// io.ByteScanner, and io.RuneScanner interfaces by reading
// from a string.
type Reader struct {
   s        string
   i        int64 // current reading index
   prevRune int   // index of previous rune; or < 0
}

func NewReader(s string) *Reader { 
    return &Reader{s, 0, -1}
}
返回的是一个Reader 结构体

string.NewReader 的参数是字符串,这个方法其实可以和os包中的Open有异曲同工之妙。接下来还是先看看bufio.NewReader这个函数的具体实现

bufio.NewReader 是bufio包里面的一个函数,

bufio包中的Reader 结构体
// Reader implements buffering for an io.Reader object.
type Reader struct {
   buf          []byte
   rd           io.Reader // reader provided by the client
   r, w         int       // buf read and write positions
   err          error
   lastByte     int
   lastRuneSize int
}

const (
   defaultBufSize = 4096
)

// NewReader returns a new Reader whose buffer has the default size.
func NewReader(rd io.Reader) *Reader {
   return NewReaderSize(rd, defaultBufSize)
}

// NewReaderSize returns a new Reader whose buffer has at least the specified
// size. If the argument io.Reader is already a Reader with large enough
// size, it returns the underlying Reader.
func NewReaderSize(rd io.Reader, size int) *Reader {
   // Is it already a Reader?
   b, ok := rd.(*Reader)
   if ok && len(b.buf) >= size {
      return b
   }
   if size < minReadBufferSize {
      size = minReadBufferSize
   }
   r := new(Reader)
   r.reset(make([]byte, size), rd)
   return r
}

其实这两个包完全是两回事,那么我们为什么要在一篇文章里面来举例说明呢?看下面的实例:

func Parseing(){
   Config.TimeoutTotal=5*time.Second

   //file:=strings.NewReader("testline")
   file,err=os.Open("/Users/helay/go/src/workspace/webkkCurl/etc/curl.conf")
   if err!=nil {
      fmt.Printf("%s",err)
      return
   }
   read:=bufio.NewReader(file)
   for  {
      c,pk,err:=read.ReadLine()
      fmt.Printf("这一行的内容是:%s;pk是:%t\n",c,pk)
      if err==io.EOF {
         fmt.Printf("到头了\n")
         break
      }
      if err!=nil && err!=io.EOF {
         fmt.Printf("读取错误")
         break
      }

   }
}

看上面例子中,两种给file赋值的方式,第一个就是strings.NewReader,可以将字符串读取给bufio.NewReader使用。下面的那个file赋值是用os包中的Open方法,打开一个文件,然后给bufio.NewReader。

所以说,strings.NewReader 与 bufio.NewReader 的差异就体现在这里。

 
posted @ 2019-12-31 12:41  D_R_Y  阅读(1890)  评论(0编辑  收藏  举报