Go语言 文件操作
@
引言
计算机的文件是存储再外部介质(硬盘)上的数据集合,文件分为文本文件和二进制文件
1. 打开和关闭文件
os.open()函数能够打开一个文件,返回一个*File和一个err,对得到的文件示例close()方法能够关闭文件
close()可以释放内存空间
- 示例:
package main
import (
"fmt"
"os"
)
func main() {
//系统打开文件并赋予文件实体
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打开失败", err)
} else {
fmt.Println("文件打开成功")
file.Close()
fmt.Println("文件关闭成功")
}
}
//输出结果如下
文件打开失败 open ./abc.txt: The system cannot find the file specified.
package main
import "fmt"
func hello() {
defer fmt.Println("执行defer") //延迟处理,函数关闭前执行
for i := 0; i < 10; i++ {
fmt.Println(i)
if i == 8 {
//手动宕机处理,立马关闭当前程序,并释放内存空间
panic("程序宕机") //阈值
}
}
}
func main() {
hello()
}
2. 读取文件
接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回 0 和 io.EOF
func (f *File) Read(b []byte) (n int,err error)
2.1 defer 语句
- 示例:
defer—般用于资源的释放和异常的捕捉。
defer语句会将其后面跟随的语句进行延迟处理;跟在defer后面的语言将会在程序进行最后的return之后再执行
在defer归属的函数即将返回时,将延迟处理的语句按defer的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。
package main
import "fmt"
func main() {
defer fmt.Println("执行defer语句") //延迟处理,函数关闭前执行
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}
//输出结果如下
0
1
2
3
4
执行defer语句
2.2 手动宕机处理
package main
import "fmt"
func hello() {
defer fmt.Println("执行defer") //延迟处理,函数关闭前执行
for i := 0; i < 10; i++ {
fmt.Println(i)
if i == 8 {
//手动宕机处理,立马关闭当前程序,并释放内存空间
panic("程序宕机")
}
}
}
func main() {
hello()
}

2.3 打开文件并获取内容
package main
import (
"fmt"
"io"
"os"
)
func main() {
//读取文件
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打开失败", err)
return
}
defer file.Close() //main函数结束前执行文件资源释放
fmt.Println("文件打开成功")
//定义参数切片
var result [128]byte
n, err := file.Read(result[:]) //以切片的形式读取
//文件读取完成,进行判断
if err == io.EOF {
fmt.Println("文件读取完毕", err)
return
}
//读取过程中出现异常
if err != nil {
fmt.Println("文件读取失败", err)
return
}
fmt.Printf("字节数: %d 个\n", n)
fmt.Printf("获取的内容是: %s", string(result[:]))
}

2.4 bufio 读取文件
使用bufio读取,bufio 在 file 的基础上封装了一层API,支持更多的功能
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//读取文件
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打开失败", err)
return
}
//main函数结束前执行文件资源释放
defer file.Close()
//bufio缓冲区读取
reader := bufio.NewReader(file)
//循环读取内存,输出到程序中
for {
str, err := reader.ReadString('\n') //按行读取,值赋予给str
if err == io.EOF {
fmt.Print(str) //要输出,否则不显示最后一行
// fmt.Println("文件读取完毕")
return
}
if err != nil {
fmt.Println("文件读取异常", err)
return
}
fmt.Print(str) //取消ln文件中自带换行
}
}

2.5 ioutil 读取文件
package main
import (
"fmt"
"io/ioutil"
)
func ReaderFile(path string) {
content, err := ioutil.ReadFile(path)
if err != nil {
fmt.Println("文件读取异常")
return
}
fmt.Println(string(content)) //转换string格式并输出
}
func main() {
ReaderFile("./abc.txt")
}

2.6 读取奇偶行内容
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//读取文件
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打开失败", err)
return
}
//main函数结束前执行文件资源释放
defer file.Close()
//bufio缓冲区读取
reader := bufio.NewReader(file)
//计数奇偶行
count := 0
for {
str, _, err := reader.ReadLine()
count++
if err == io.EOF {
// fmt.Println("文件读取完毕")
return
}
if err != nil {
fmt.Println("文件读取异常", err)
return
}
if count%2 == 1 {
fmt.Println(string(str))
}
}
}

登录并判断用户名是否存在
package main
import (
"bufio"
"fmt"
"io"
"os"
)
//读取文件
func main() {
//var doing bool
var name string
fmt.Print("请输入用户名:")
fmt.Scan(&name)
//defer fmt.Println("用户不存在")
file, err := os.Open("./abc.txt")
if err != nil {
fmt.Println("文件打开失败", err)
return
}
//main函数结束前,执行文件资源释放
defer file.Close()
//利用bufio缓冲区读取文件
reader := bufio.NewReader(file) //建立缓冲区,将文件内容放入到缓冲区
//计数奇偶行
a := 0
for {
str, _, err := reader.ReadLine()
//每次读取,a+1
a++
if err == io.EOF {
fmt.Println("文件读取完毕")
//如果文件读取完,也没有返回,则说明用户不存在
fmt.Println("用户不存在")
return
}
if err != nil {
fmt.Println("文件读取错误")
return
}
if a%2 == 1 {
if name == string(str) {
fmt.Println("登录成功")
return
}
}
}
}

3. 写入文件
3.1 os.OpenFile() 函数
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
3.2 Write 和 WriteString 方式写入
package main
import (
"fmt"
"os"
)
//使用write和writestring写入
func main() {
//写入方式打开文件,创建新文件,开启只写模式,文件权限644
file, err := os.OpenFile("abc.txt", os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
fmt.Println("文件打开失败", err)
return
}
//字节切片写入
file.Write([]byte("this is byte write\n"))
//字符串写入
str := "this is string write"
file.WriteString(str)
}

3.3 bufio.NewWriter 方式写入
package main
import (
"bufio"
"fmt"
"os"
)
//bufio写入
func main() {
file, err := os.OpenFile("tmp.txt", os.O_CREATE|os.O_WRONLY, 0666) //WRONLY,清空
if err != nil {
fmt.Println("文件打开失败", err)
return
}
defer file.Close()
//文件写入缓冲区
write := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
//内容写入缓冲区
write.WriteString("this is bufio write\n")
}
//缓冲区数据提交写入文件
write.Flush()
}

3.4 ioutil.WriteFile 方式写入
package main
import (
"fmt"
"io/ioutil"
)
func main() {
str := "this is ioutil write\nthis is test content"
//iotuil方式直接写入,字符串转换成字节数组写入
err := ioutil.WriteFile("./tmp.txt", []byte(str), 0666)
if err != nil {
fmt.Println("文件写入失败", err)
return
}
}

Go语言 文件操作的更多相关文章
- go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )
go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...
- C语言文件操作
C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...
- C 语言文件操作
C 语言文件操作 1. 数据流: 程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流. 所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- C语言文件操作解析(五)之EOF解析(转载)
C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...
- 【转】C语言文件操作解析(三)
原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...
- C语言文件操作函数大全(超详细)
C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fc ...
- C语言文件操作 FILE结构体
内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...
- C语言文件操作相关函数
在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...
- 关于C语言文件操作
关于C语言的文件操作之前我也写过一篇博客来介绍,但是当时写的很不全面,只是简单的使用了一下 ,今天再从新学习一下. 1.文件的写 首先还是先看一个简单的例子: include<stdio.h&g ...
随机推荐
- winform 学习之qq邮箱正则验证及常用正则
这段时间一直再做winform相关的项目,记录了一些东西 qq邮箱正则表达式: 第一种:字母和数字组合邮箱判断 string str = "justin1107@qq.com"; ...
- 项目可以怎么规范Git commit ?
通常情况下,commit message应该清晰明了,说明本次提交的目的,具体做了什么操作.但是在日常开发中,大家的commit message都比较随意,中英文混合使用的情况有时候很常见,这就导致后 ...
- Charles的安装及设置
1. Charles的安装 l 下载安装包 l 安装:按照提示信息一步步安装,不做多余解释 l 破解:将Charles.jar包放在安装目录,如D:\Program Files\Charles\ ...
- Spring cache源码分析
Spring cache是一个缓存API层,封装了对多种缓存的通用操作,可以借助注解方便地为程序添加缓存功能. 常见的注解有@Cacheable.@CachePut.@CacheEvict,有没有想过 ...
- Redis 集群,集群的原理是什么?
1).Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为master,继续提供服务. 2).Redis Cluster 着眼于扩展性,在单个 redis ...
- 详细描述一下 Elasticsearch 更新和删除文档的过程?
1.删除和更新也都是写操作,但是 Elasticsearch 中的文档是不可变的,因此不 能被删除或者改动以展示其变更: 2.磁盘上的每个段都有一个相应的.del 文件.当删除请求发送后,文档并没有真 ...
- 什么是 Spring beans?
Spring beans 是那些形成 Spring 应用的主干的 java 对象.它们被 Spring IOC 容器初始化,装配,和管理.这些 beans 通过容器中配置的元数据创建.比如, 以 XM ...
- Linux 中进程有哪几种状态?在 ps 显示出来的信息中, 分别用什么符号表示的?
1.不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的.不可中断, 指进程不响应异步信号. 第 441 页 共 485 页2.暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响 ...
- 算法导论 - 基础知识 - 算法基础(插入排序&归并排序)
在<算法导论>一书中,插入排序作为一个例子是第一个出现在该书中的算法. 插入排序: 对于少量元素的排序,它是一个有效的算法. 插入排序的工作方式像许多人排序一手扑克牌.开始时,我们手中牌为 ...
- SCTF 2018_Simple PHP Web
SCTF 2018_Simple PHP Web 进入环境注意观察url http://www.bmzclub.cn:23627/?f=login.php 有点像是文件读取我们尝试读一下/etc/pa ...