go语言文件操作

打开和关闭文件

os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。

package mainimport ("fmt""os"
)func main() {// 只读方式打开当前目录下的main.go文件file, err := os.Open("./main.go")if err != nil {fmt.Println("open file failed!, err:", err)return}// 关闭文件file.Close()
}

为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句。

读取文件

file.Read()

基本使用

Read方法定义如下:

func (f *File) Read(b []byte) (n int, err error)

它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0io.EOF。 举个例子:

func main() {// 只读方式打开当前目录下的main.go文件file, err := os.Open("./main.go")if err != nil {fmt.Println("open file failed!, err:", err)return}defer file.Close()// 使用Read方法读取数据var tmp = make([]byte, 128)n, err := file.Read(tmp)if err == io.EOF {fmt.Println("文件读完了")return}if err != nil {fmt.Println("read file failed, err:", err)return}fmt.Printf("读取了%d字节数据\n", n)fmt.Println(string(tmp[:n]))
}

循环读取

使用for循环读取文件中的所有数据。

func main() {// 只读方式打开当前目录下的main.go文件file, err := os.Open("./main.go")if err != nil {fmt.Println("open file failed!, err:", err)return}defer file.Close()// 循环读取文件var content []bytevar tmp = make([]byte, 128)for {n, err := file.Read(tmp)if err == io.EOF {fmt.Println("文件读完了")break}if err != nil {fmt.Println("read file failed, err:", err)return}content = append(content, tmp[:n]...)}fmt.Println(string(content))
}

bufio读取文件

bufio是在file的基础上封装了一层API,支持更多的功能。

package mainimport ("bufio""fmt""io""os"
)// bufio按行读取示例
func main() {file, err := os.Open("./xx.txt")if err != nil {fmt.Println("open file failed, err:", err)return}defer file.Close()reader := bufio.NewReader(file)for {line, err := reader.ReadString('\n') //注意是字符if err == io.EOF {if len(line) != 0 {fmt.Println(line)}fmt.Println("文件读完了")break}if err != nil {fmt.Println("read file failed, err:", err)return}fmt.Print(line)}
}

读取整个文件

io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。

package mainimport ("fmt""io/ioutil"
)// ioutil.ReadFile读取整个文件
func main() {content, err := ioutil.ReadFile("./main.go")if err != nil {fmt.Println("read file failed, err:", err)return}fmt.Println(string(content))
}

文件写入操作

os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。

func OpenFile(name string, flag int, perm FileMode) (*File, error) {...
}

其中:

name:要打开的文件名 flag:打开文件的模式。 模式有以下几种:

模式含义
os.O_WRONLY只写
os.O_CREATE创建文件
os.O_RDONLY只读
os.O_RDWR读写
os.O_TRUNC清空
os.O_APPEND追加

perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。

Write和WriteString

func main() {file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)if err != nil {fmt.Println("open file failed, err:", err)return}defer file.Close()str := "hello 沙河"file.Write([]byte(str))       //写入字节切片数据file.WriteString("hello 小王子") //直接写入字符串数据
}

bufio.NewWriter

func main() {file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)if err != nil {fmt.Println("open file failed, err:", err)return}defer file.Close()writer := bufio.NewWriter(file)for i := 0; i < 10; i++ {writer.WriteString("hello沙河\n") //将数据先写入缓存}writer.Flush() //将缓存中的内容写入文件
}

ioutil.WriteFile

func main() {str := "hello 沙河"err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)if err != nil {fmt.Println("write file failed, err:", err)return}
}

文件拷贝

借助io.Copy()实现一个拷贝文件函数。

// CopyFile 拷贝文件函数
func CopyFile(dstName, srcName string) (written int64, err error) {// 以读方式打开源文件src, err := os.Open(srcName)if err != nil {fmt.Printf("open %s failed, err:%v.\n", srcName, err)return}defer src.Close()// 以写|创建的方式打开目标文件dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)if err != nil {fmt.Printf("open %s failed, err:%v.\n", dstName, err)return}defer dst.Close()return io.Copy(dst, src) //调用io.Copy()拷贝内容
}
func main() {_, err := CopyFile("dst.txt", "src.txt")if err != nil {fmt.Println("copy file failed, err:", err)return}fmt.Println("copy done!")
}

文件内容读取

1、r.ReadSlice('\n')
最原始的方式,如果超出了 buf 长度会正常返回,且 err = ErrBufferFull

2、r.ReadString('\n')
对 ReadSlice的简单调用,只是返回的是字符串。

3、r.ReadLine()
也是对 ReadSlice的调用,只是它会删掉末尾的换行符,多此一举,低效。

4、r.ReadBytes('\n')
也是对 ReadSlice的调用,不同的是,当 err = ErrBufferFull 时,它会扩展 buf 的大小,并多次调用 ReadSlice,直到这一行被读完,相对智能一些,推荐使用。

package mainimport ("bufio""flag""fmt""io""os"
)// cat命令实现
func cat(r *bufio.Reader) {for {buf, err := r.ReadBytes('\n') //注意是字符if err == io.EOF {// 退出之前将已读到的内容输出fmt.Fprintf(os.Stdout, "%s", buf)break}fmt.Fprintf(os.Stdout, "%s", buf)}
}func main() {flag.Parse() // 解析命令行参数if flag.NArg() == 0 {// 如果没有参数默认从标准输入读取内容cat(bufio.NewReader(os.Stdin))}// 依次读取每个指定文件的内容并打印到终端for i := 0; i < flag.NArg(); i++ {f, err := os.Open(flag.Arg(i))if err != nil {fmt.Fprintf(os.Stdout, "reading from %s failed, err:%v\n", flag.Arg(i), err)continue}cat(bufio.NewReader(f))}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习PyQt5

1、布局之后&#xff0c;无法移动对象到指定区域&#xff0c;无法改变对象大小。 原因&#xff1a;因为CtrlA选中了整个窗口&#xff0c;然后布局的时候就相当于整个窗口都按照这种布局&#xff0c;如选了水平布局&#xff0c;按钮一直在中间&#xff0c;无法拖到其它位置。 …

Unity之动画和角色控制

目录 &#x1f4d5; 一、动画 1.创建最简单的动画 2.动画控制器 &#x1f4d5;二、把动画和角色控制相结合 &#x1f4d5;三、实现实例 3.1 鼠标控制角色视角旋转 3.2 拖尾效果 &#x1f4d5;四、混合动画 最近学到动画了&#xff0c;顺便把之前创建的地形&#xff0…

go语言数组和切片

1. 数组Array Golang Array和以往认知的数组有很大不同。 1. 数组&#xff1a;是同一种数据类型的固定长度的序列。2. 数组定义&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且是类型的组成部分。一旦定义&…

Redis3-秒杀活动

秒杀 准备工作 我是参照下面这位大佬的i骄傲成下载的 csdn友情链接 Jmeter模拟多线程的压力测试工具 秒杀代码&#xff1a; package com.aaa.controller;import io.netty.util.internal.StringUtil; import org.apache.commons.lang.StringUtils; import org.springfram…

appsmith安装手记:2.安装Docker compose

方法一&#xff1a;Install using the repository sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 在安装Docker 已经吃过了亏&#xff0c;所以已经修改成阿里云的镜像。 yum-config-manager --a…

【大数据】详解 Flink 中的 WaterMark

详解 Flink 中的 WaterMark 1.基础概念1.1 流处理1.2 乱序1.3 窗口及其生命周期1.4 Keyed vs Non-Keyed1.5 Flink 中的时间 2.Watermark2.1 案例一2.2 案例二2.3 如何设置最大乱序时间2.4 延迟数据重定向 3.在 DDL 中的定义3.1 事件时间3.2 处理时间 1.基础概念 1.1 流处理 流…

深度推荐模型之DeepFM

一、FM 背景&#xff1a;主要解决大规模稀疏数据下的特征组合遇到的问题&#xff1a;1. 二阶特征参数数据呈指数增长 怎么做的&#xff1a;对每个特征引入大小为k的隐向量&#xff0c;两两特征的权重值通过计算对应特征的隐向量内积 而特征之间计算点积的复杂度原本为 实际应…

javascript分解器

javascript分解器 //split into array of strings. var str "Well, how, are , we , doing, today"; var res str.split(",");

幻兽帕鲁的搭建和幻兽帕鲁需要什么配置的服务器

前言 大家好&#xff0c;今天教大家如何快速搭建幻兽帕鲁&#xff0c;并能满足8-32人游玩 第一步 购买服务器 1.CPU&#xff1a;4核&#xff08;最低需要4核起&#xff0c;当然可以选择更高的&#xff09;CPU的选择更看重单核性能&#xff0c;尽量选择主频2.5GHz以上的&#…

python3-cookbook-字典中的键映射多个值

第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典。大多数情况下使用这些数据结构是很简单的。但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题。 因此,这一章的目的就是讨论这些比较常见的问题和算法。 另外,我们也会…

嵌入式C语言--#pragma指令

嵌入式C语言–#pragma指令 嵌入式C语言--#pragma指令 嵌入式C语言--#pragma指令一. pragma预处理指令概念二. pragma预处理指令的作用三. 预处理指令的参数1&#xff09;message参数2&#xff09;code_seg参数3&#xff09;once参数4&#xff09;pack参数5&#xff09; section…

OpenTCS IDEA 全流程搭建和运行指南

OpenTCS IDEA 全流程搭建和运行指南 JDK安装下载JDK版本 openTCS源码下载IDEA 打开运行查看下载源码中gradle版本号下载gradle 二进制文件配置IDEA Gradle本地仓库IDEA打开openTCS项目运行顺序 JDK安装 下载JDK版本 JDK网址 注意&#xff1a; 请下载官方文档标准的java13JDK o…

paddle 动态图命名重复问题

引言 具体场景是这样的,我用ai studio提供的notebook跑动态图代码,第一遍正常,第二遍的时候就报参数名称已存在,虽然我也知道这是notebook存储之前的参数变量引起的,只需要重启再运行就可以了。但是重启代价太高了,尤其是前面已经写了很多代码,而我只是想测试这一个cell…

4G模块Air724如何访问天气信息

1.这是获得json数据&#xff1a; 左边是标准官方api说明中的&#xff0c;右边是我用串口获取的&#xff1a; 2.首先找一个天气服务器&#xff0c;我的&#xff1a;YY天气&#xff0c;直接百度&#xff0c;注册&#xff0c;然后找api即可&#xff1a; 3.用接口工具测试接口是否…

AV Foundation 视频播放中的可视拖拽进度条

引言 在视频播放软件中&#xff0c;通过拖拽进度条来调整播放进度几乎已成为不可或缺的功能。这一功能使用户能够精确指定视频播放的时间点。近年来&#xff0c;视频播放器在原有的拖拽进度条基础上进行了更加人性化的性能提升&#xff0c;引入了可视化拖拽条。这一创新为用户…

如何利用 chatgpt 提高查询效率

问 chatgpt 问题&#xff1a; 如何利用chatgpt 提高工作效率 chatgpt回答 利用ChatGPT可以提高工作效率的方法有很多。以下是一些建议&#xff1a;1. 自动化任务&#xff1a;将一些重复性的任务自动化&#xff0c;让ChatGPT代替你完成。 例如&#xff0c;你可以编写脚本来处理…

Ps:根据 HSB 调色(以可选颜色命令为例)

在数字色彩中&#xff0c;RGB 和 HSV&#xff08;又称 HSB&#xff09;是两种常用的颜色表示方式&#xff08;颜色模型&#xff09;。 在 RGB 颜色模式下&#xff0c;Photoshop 的红&#xff08;Red&#xff09;、绿&#xff08;Green&#xff09;、蓝&#xff08;Blue&#xf…

Spring Boot参数校验方案

NotNull&#xff1a;值不能为null&#xff1b;NotEmpty&#xff1a;字符串、集合或数组的值不能为空&#xff0c;即长度大于0&#xff1b;NotBlank&#xff1a;字符串的值不能为空白&#xff0c;即不能只包含空格&#xff1b;Size&#xff1a;字符串、集合或数组的大小是否在指…

基于SpringBoot微信小程序的宠物美容预约系统设计与实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容&#xff1a;SpringBoot、Vue、SSM、HLM…

rabbitmq基础-java-3、Fanout交换机

1、简介 Fanout&#xff0c;英文翻译是扇出。 2、 特点 1&#xff09; 可以有多个队列 2&#xff09; 每个队列都要绑定到Exchange&#xff08;交换机&#xff09; 3&#xff09; 生产者发送的消息&#xff0c;只能发送到交换机 4&#xff09; 交换机把消息发送给绑定过的…