本篇文章是对区块链开发中的Go语言中常用的io操作的库做一个梳理
实现了Reader接口的都可以用read方法,将数据读入到p字节数组,n表示读取了几个字节,err返回错误。 如果读到了文件尾EOF,则err返回EOF。 注意,当文件最后一小段已经无法填满p这个字节数组时,不会产生EOF的错误,只会在下一次读取时产生n=0,err=io.EOF的错误
举例
Write 将 len(p) 个字节从 p 中写入到基本数据流中。它返回从 p 中被写入的字节数 n(0 <= n <= len(p))以及任何遇到的引起写入提前停止的错误。若 Write 返回的 n < len(p),它就必须返回一个 非nil 的错误。 常见错误原因有磁盘满了
和Reader,Writer类似,但是需要自己调控偏移量。 注意:接近文件尾巴时,当n小于数组大小时也触发了err.EOF,需要自行把最后n小于数组大小的这点数据处理一下。
举例:
一次性读完直到EOF,或者写入全部数据
用来设置偏移量,也就是从哪开始读,offset由whence解释。
读或写一个字节
一次性读取数据
读取目录并返回排好序的文件和子目录名
这里特别注意的是写文件的权限问题,perm的数值,和linux规则一致 四位(777):
模式 | 数字 |
---|---|
rwx | 7 |
rw- | 6 |
r-x | 5 |
r-- | 4 |
-wx | 3 |
-w- | 2 |
--x | 1 |
--- | 0 |
组合如0666,表示rw-rw-rw- |
是io库的包装,提供带缓存的方法
后三个方法最终都是调用ReadSlice来实现的
示例:
输出:
注意ReadSlice每次返回的line是指向同一个缓存数组,因此ReadSlice的实现是反复覆盖重写缓存数组。
如果ReadSlice在找到分界符前
返回的byte是copy的一份数组
从以下实验可看出来
输出
是对ReadBytes的封装,将返回的line转换成string
这里要说的是isPrefix,用于读取的一行超过了缓存大小,则isPrefix为true,下次还读这行余下的部分,直到读完这行才isPrefix返回false
ReadLine返回的文本不会包含行结尾("\r\n"或者"\n")
该方法只是“窥探”一下Reader中没有读取的n个字节。好比栈数据结构中的取栈顶元素,但不出栈。
同上面介绍的ReadSlice一样,返回的[]byte只是buffer中的引用。所以在并发的时候有可能就被别人给改了
用于方便的按token读取数据,token的分词规则用SplitFunc定义。默认按行分词,会去掉末尾换行符。 了解Scanner前要先了解SplitFunc
SplitFunc 定义了 用于对输入进行分词的 split 函数的签名。
参数
返回值
举例
输出
你也可以用系统定义好的几个分割token的方法。
带缓存的writer,记得在最终的写入操作执行完后flush一下,确保全部缓存都真正写入。
1.《Go语言标准库》The Golang Standard Library by Example