Golang中os.Reader和ReaderAt的区别,及ReaderAt快速读取日志文件的实现

一、os.Read()

// Read reads up to len(b) bytes from the File.
// It returns the number of bytes read and any error encountered.
// At end of file, Read returns 0, io.EOF.
func (f *File) Read(b []byte) (n int, err error) {
	if err := f.checkValid("read"); err != nil {
		return 0, err
	}
	n, e := f.read(b)
	return n, f.wrapErr("read", e)
}

os.Read()传入一个buffer,返回读取多少行及错误
如果读完,则返回0和io.EOF

二、os.ReadAt()

// ReadAt reads len(b) bytes from the File starting at byte offset off.
// It returns the number of bytes read and the error, if any.
// ReadAt always returns a non-nil error when n < len(b).
// At end of file, that error is io.EOF.
func (f *File) ReadAt(b []byte, off int64) (n int, err error) {
	if err := f.checkValid("read"); err != nil {
		return 0, err
	}

	if off < 0 {
		return 0, &PathError{"readat", f.name, errors.New("negative offset")}
	}

	for len(b) > 0 {
		m, e := f.pread(b, off)
		if e != nil {
			err = f.wrapErr("read", e)
			break
		}
		n += m
		b = b[m:]
		off += int64(m)
	}
	return
}
  • os.ReadeAt()传入两个参数,一个是buffer(一个[]byte),一个偏移量(即偏移行数)
  • 返回两个参数,一个行数,一个错误,如果读完,则返回os.EOF

三、os.Read()和os.ReadAt()区别及注意事项

1.os.Read()的四种返回状态

  • 1.读取成功,返回读取多少行,err != nil
  • 2.如果读取到失败了,err != nil,这个时候err返回响应的错误。
  • 3.如果读取到EOF,err == EFO ,n是读到的数据大小
  • 4.如果读取过程中,数据还没有准备好,返回的err 为nil;没有读满buffer,也不是EOF。此时代码不报错

2.os.ReadAt()的三种返回值状态

  • 1.读取成功,返回读取多少行,err != nil
  • 2.如果读取到失败了,err != nil,这个时候err返回响应的错误。
  • 3.如果读取到EOF,err == EFO ,n是读到的数据大小

3.总结

  • 总的来说,Read()比ReadAt()更加严格。Read使用可能会造成一定的风险。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抬头看天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值