golang-文件读写

golang-文件读写,第1张

文件分类:文本文件和二进制文件

文本文件可读性好,占用的数据空间大

二进制文件,可读性差,占用的数据空间小

文件存取方式:随机存取和顺序存放

随机存取: *** 作速度慢,对磁盘的消耗大

顺序存放: *** 作数据块,对磁盘的消耗小

初级方法

高级方法

在程序和文件之间,添加一个缓冲区,每次程序读取文件内容的时候,先去缓冲区查看,如果需要的内容,直接获取,如果没有再去文件中获取

由于缓冲是在内存当中的,和程序的交互返回速度会非常快,神晌这样可以大大提高程序的性能和速度罩歼

缺点:有的数据是只在缓冲中存储的,如果在缓冲释放之前游闷锋,没有将数据实例化落盘,会导致数据的丢失

按行 *** 作文件对象

将之前的file方法封装起来,可以更加方便的使用

使用gzip.NewReader(文件句柄),来 *** 作压缩文件

示例: file,err := os.OpenFile("main.go", os.O_WRONLY|os.O_WRONLY, 0666)

三个参数,

文件 *** 作方法,需要注意不能冲突

*** 作完成后,当前目录出现一个text.txt 文件,内容是:hello world,test

这里可以可以考虑使用buffio来实现

使用文件名作为输入

另一个常见错误是将文件名传递给函数。

假设我们必须实现一个函数来计算文件埋则中的空行数。最自然的实现是这样的:

filename 作为输入给出,所以我们打开它然后我们实现我们的逻辑,对吧?

现在,假设我们希望在此函数之上实现 单元测试 ,以使用普通文件,空销携文件,具有不同编码类型的文件等进行测试。很容易变得非常难以管理。

此外,如果我们想要实现相同的逻辑但是对于HTTP主体,例如,我们将不得不为此创建另一个函数。

Go有两个很棒的抽象: io.Reader 和 io.Writer 。相反,通过一个文件名,我们可以简单地传递一个 io.Reader 作为 抽象 的数据源。

它是文件吗?一个HTTP正文?字节缓冲区?这并不重要,因为我们仍然会使用相同的 Read 方法。

在我们的例子中,我们甚至可以缓冲输入以逐行读取它。所以,我们弯斗棚可以使用 bufio.Reader 它的 ReadLine 方法:

现在,打开文件本身的责任委托给 count 客户:

使用第二种实现,无论 实际数据源 如何,都可以调用该函数。同时,它将 促进 我们的单元测试,因为我们可以简单地创建一个 bufio.Reader 来自 string :

翻译自: https://medium.com/swlh/the-most-common-mistakes-with-read-file-in-golang-be87239fd03b

bufReader.ReadBytes('\纳迅n')和 bufReader.ReadString('\n')在读到文件最后一和睁行时,会同时返回内容line和io.EOF。而bufReader.Read()读取到末尾时,会先返回内容,然后再下一次迭代时才唤茄岁返回io.EOF


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12121864.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存