golang bufio包中Write方法的深入讲解
作者:benben_2015 发布时间:2024-05-08 10:45:31
标签:golang,bufio包,write
前言
bufio包实现了带缓冲的I/O,它封装了io.Reader和io.Writer对象,然后创建了另外一种对象(Reader或Writer)实现了相同的接口,但是增加了缓冲功能。
首先来看没有缓冲功能的Write(os包中)方法,它会将数据直接写到文件中。
package main
import (
"os"
"fmt"
)
func main() {
file, err := os.OpenFile("a.txt", os.O_CREATE|os.O_RDWR, 0666)
if err != nil {
fmt.Println(err)
}
defer file.Close()
content := []byte("hello world!")
if _, err = file.Write(content); err != nil {
fmt.Println(err)
}
fmt.Println("write file successful")
}
接着看一个错误的使用带缓冲的Write方法例子,当下面的程序执行后是看不到写入的数据的。
package main
import (
"os"
"fmt"
"bufio"
)
func main() {
file, err := os.OpenFile("a.txt", os.O_CREATE|os.O_RDWR, 0666)
if err != nil {
fmt.Println(err)
}
defer file.Close()
content := []byte("hello world!")
newWriter := bufio.NewWriter(file)
if _, err = newWriter.Write(content); err != nil {
fmt.Println(err)
}
fmt.Println("write file successful")
}
为什么会在文件中看不到写入的数据呢,我们来看看bufio中的Write方法。
func (b *Writer) Write(p []byte) (nn int, err error){
for len(p) > b.Available() && b.err == nil {
var n int
if b.Buffered() == 0{
n,b.err =b.wr.Write(p)
}else {
n = copy(b.buf[b.n:],p)
b.n+=n
b.Flush()
}
nn+=n
p=p[n:]
}
if b.err!=nil {
return nn, b.err
}
n:= copy(b.buf[b.n:],p)
b.n+= n
nn+=n
return nn,nil
}
Write方法首先会判断写入的数据长度是否大于设置的缓冲长度,如果小于,则会将数据copy到缓冲中;当数据长度大于缓冲长度时,如果数据特别大,则会跳过copy环节,直接写入文件。其他情况依然先会将数据拷贝到缓冲队列中,然后再将缓冲中的数据写入到文件中。
所以上面的错误示例,只要给其添加Flush()方法,将缓存的数据写入到文件中。
package main
import (
"os"
"fmt"
"bufio"
)
func main() {
file, err := os.OpenFile("./a.txt", os.O_CREATE|os.O_RDWR, 0666)
if err != nil {
fmt.Println(err)
}
defer file.Close()
content := []byte("hello world!")
newWriter := bufio.NewWriterSize(file, 1024)
if _, err = newWriter.Write(content); err != nil {
fmt.Println(err)
}
if err = newWriter.Flush(); err != nil {
fmt.Println(err)
}
fmt.Println("write file successful")
}
来源:https://blog.csdn.net/benben_2015/article/details/80614230


猜你喜欢
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 5 - Event HandlingMooTool
- 句柄(handle)是C++程序设计中经常提及的一个术语。它并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念
- python包-pdfkit 将HTML转换为PDF什么是pdfkitpdfkit,把HTML+CSS格式的文件转换成PDF格式文档的一种工
- 上期回顾:亚马逊购物用户体验分析 (二)方便的导航元素任何网上商店的成功,至关重要的一点,就是用户可以简单轻松地使用导航条。基本店铺分类,用
- 在现在的项目里,不管是电商项目还是别的项目,在管理端都会有导出的功能,比方说订单表导出,用户表导出,业绩表导出。这些都需要提前生成excel
- 在Python 3.5(含)以前,字典是不能保证顺序的,键值对A先插入字典,键值对B后插入字典,但是当你打印字典的Keys列表时,你会发现B
- 1.列表元素删操作的方法列表的删操作指的是在列表中删除已存在的元素,列表中的元素被删除后,后面所有的元素依次往前移动一位,挂在被删除元素的索
- 1. 监测端口我们要引用的socket模块来校验端口是否被占用。1.1 socket是什么?简单一句话:网络上的两个程序通过一个双向的通信连
- 首先,我们知道一副牌里有54张牌,然后牌里的数字是从 3 - 2 的里面总共有13张牌,然后 4 中花色 分别是 ♠?
- MS SQL性能是很不错的,但是数据库用了一段时间之后,数据库却变得很大,实际的数据量不大。一般都是数据库日志引起的!数据库日志的
- 很多网站登录登陆时都要用到滑块验证码,在某些场景例如使用爬虫爬取信息时常常受到阻碍,想着用opencv的模板匹配试试能不能实现模拟登陆。本来
- 世上无难事,只要找到 Homebrew 的正确安装方式。Homebrew 是什么Homebrew是 mac的包管理器,仅需执行相应的命令,就
- 安装tf2onnx以及onnxruntimepip install onnxruntimepip install tf2onnxtf 转为o
- 如果视图定义包括条件(譬如 WHERE 子句)并且其意图是确保任何引用该视图的 INSERT 或 UPDATE 语句都应用 WHERE 子句
- 本文实例讲述了Python类的继承、多态及获取对象信息操作。分享给大家供大家参考,具体如下:继承类的继承机制使得子类可以继承父类中定义的方法
- 在XHTML标签中有一些标签的作用是相似的,当然这里的相似是指语义相似,以至于很多人都不清楚这些相似的标签如何使用,那么今天的主题就是分解相
- 这是一个获取字符串中两个子串之间的子串,如从字符串www.aspxhome.com中获取coderbolg子串,就让这个PHP函数来实现吧,
- 本文实例讲述了Python基于socket模块实现UDP通信功能。分享给大家供大家参考,具体如下:一 代码1、接收端import socke
- <script language=javascript> function moveIt(obj){ var tableId;
- 实例如下所示:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition