@


引言

计算机的文件是存储再外部介质(硬盘)上的数据集合,文件分为文本文件和二进制文件

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. 读取文件

接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回 0io.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()
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/8897798d87be42198949231dc5a6773a.png#pic_center =500x)

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
}
}
}
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/a444b2a6c17342a7936dce1c356e11c8.png#pic_center =600x)

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
}
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/e170c294440d4eb0a1de65e807fa08ab.png#pic_center =555x)

Go语言 文件操作的更多相关文章

  1. go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

    go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...

  2. C语言文件操作

    C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...

  3. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

  4. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  5. C语言文件操作解析(五)之EOF解析(转载)

      C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...

  6. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  7. C语言文件操作函数大全(超详细)

    C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下   fopen(打开文件)相关函数 open,fc ...

  8. C语言文件操作 FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

  9. C语言文件操作相关函数

    在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...

  10. 关于C语言文件操作

    关于C语言的文件操作之前我也写过一篇博客来介绍,但是当时写的很不全面,只是简单的使用了一下 ,今天再从新学习一下. 1.文件的写 首先还是先看一个简单的例子: include<stdio.h&g ...

随机推荐

  1. 如何用系统命令sc修改系统服务

    系统服务是系统的一项重要组成部分,sc命令在特定权限下,可以实现对指定服务的启动项.配置文件及状态进行修改,位置在c:\windows\system32\目录下面,下面就和大家分享一下如何用系统命令s ...

  2. automake的使用1

    安装命令: sudo apt install automake autoconfig 简单的例子 automake实例: helloworld.c #include <stdio.h> # ...

  3. 半吊子菜鸟学Web开发6 -- Vscode开发环境配置

    1vscode上手一周不到,终于弄出点门路,终于弄清楚了点vscode的设置是什么样子的了....哭 2就我这两天的使用来看,一般vscode默认只让打开一个文件夹,然后在你打开的文件夹里面自动生成 ...

  4. Linux下使用压力测试工具stress

    一:stress的安装 首先解压安装包到/usr/local/src/下 mv stress-1.0.4.tar.gz /usr/local/src​tar -zxf stress-1.0.4.tar ...

  5. leedcode算法

    1.LeetCode - 合并两个链表 2. 3. 链表是否有环       https://jingyan.baidu.com/article/066074d69afb8d83c31cb068.ht ...

  6. RabbitMQ 的集群?

    镜像集群模式 你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,然后 每次你写消息到 queue 的时候,都会自动把消息到多个实例的 queue 里进行消息 同步. 好处 ...

  7. Files的常用方法都有哪些?

    Files. exists():检测文件路径是否存在.Files. createFile():创建文件.Files. createDirectory():创建文件夹.Files. delete():删 ...

  8. 动态JDK代理方式-实现类增强

    需求描述: 抽取dao层开启和提交事物交由代理类一并执行 分析: 假如UserDao接口中有很多方法,例如addUser().deleteUser().updateUser()等等,需要频繁的和数据库 ...

  9. x64 简介

      本篇原文为 introduction to x64 assembly ,如果有良好的英文基础,可以点击该链接进行下载阅读.本文为我个人:寂静的羽夏(wingsummer) 中文翻译,非机翻,著作权 ...

  10. can总线第一讲

    一  官方简介如下: 控制器局域网CAN(Controller Area Network),是由德国Bosch公司为汽车应用而开发的多主机局部网络,应用于汽车的监测和控制.德国Bosch公司开发CAN ...