@


引言

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

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. MindSpore尝鲜之Vmap功能

    技术背景 Vmap是一种在python里面经常提到的向量化运算的功能,比如之前大家常用的就是numba和jax中的向量化运算的接口.虽然numpy中也使用到了向量化的运算,比如计算两个numpy数组的 ...

  2. String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

    没有.因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象.在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行 ...

  3. 怎么样把ModelMap里面的数据放入Session里面?

    答:可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key.

  4. Spring-boot-菜鸟-properties配置

    如果测试结果出现中文乱码: 结果": Person{lastName='张胜男', age=11, boss=false, birth=Wed Nov 11 00:00:00 CST 202 ...

  5. HTML、JavaScript、Java、CSS它们的注释有哪些相同和不同?

    <!--html--> /*css*/ //javascript /*javascript*/

  6. jmeter的安装使用

    以前没自己做过压力测试,一直都是测试在做.现在需要自己做压力测试了,特别学习下jmeter的使用方法.现在做下记录: 1.下载jmeter,这个忽略,百度到处都是 2.打开jmeter,jmeter的 ...

  7. 一个用于学习的react项目

    React-element 根据开源项目 vue-sell进行的开发,将其改造成了react的项目.在开始学习vue的时候就是用的这个项目,发现效果不错,所以在学习React也使用了此项目. 目的:将 ...

  8. android webview与jquery mobile相互通信

    最近做android项目中遇到要在webview中做与js交互相关的东东,涉及到js中调用android本地的方法,于是查了资料整理了一下android和js互相调用的过程.如下demo,demo的主 ...

  9. 前端基础之CSS(1)

    1.css3的新特性有哪些 (1)CSS3选择器(基本.属性.伪类具体见下) (2)CSS3边框与圆角 圆角border-radius 属性:border-top-left-radius 左上角 bo ...

  10. .NET程序设计实验一

    实验一  语言基础 一.实验目的 1. 熟悉Visual Stido.NET 实验环境: 2. 掌握控制台程序的编写方法: 3. 掌握C#程序设计语言的语法基础: 4. 掌握控制语句和数组的使用. 二 ...