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 ...
随机推荐
- OpenCores注册步骤和成功提交
一 OpenCores 网站简介,这个是全世界最大的FPGA开源IP核网站.由于最近在学习USB2.0host control IP,所以想去网上下载相关的IP例程学习.通过搜索发现,有两个网站十分 ...
- 关于List、Set、Map接口讲解
概述 List.Set接口都是继承于Collection主接口,而Map为独立接口 1.List接口下有ArrayList.Vector.LinkedList实现类 2.Set接口下有HashSet. ...
- 一种优雅的Golang的库插件注册加载机制
一种优雅的Golang的库插件注册加载机制 你好,我是轩脉刃. 最近看到一个内部项目的插件加载机制,非常赞.当然这里说的插件并不是指的golang原生的可以在buildmode中加载指定so文件的那种 ...
- Material Design with the Android Design Support Library
Material Design with the Android Design Support Library 原文http://www.sitepoint.com/material-design-a ...
- 什么是ORM思想?常用的基于ORM的框架有哪些?各有什么特点?
ORM的全称是Object-Relational Mapping,即对象关系映射.ORM思想的提出来源于对象与关系之间相悖的特性.我们很难通过对象的继承与聚合关系来描述数据表中一对一.一对多以及多对多 ...
- 什么是 AQS ?
AQS 是 AbustactQueuedSynchronizer 的简称,它是一个 Java 提高的底层同步工具类,用一个 int 类型的变量表示同步状态,并提供了一系列的 CAS 操作来管理这个同步 ...
- 学习Apache(四)
介绍 Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作.不同平台和不同的环境往往需要不同 的特性,或可能以不同的方式实现相同的特性最有效率. ...
- SVG Sprite 入门(SVG图标解决方案)
关于浏览器图标解决方案,一直就有很多 CSS Sprite,Icon Font,CSS Icon以及SVG.相对而言svg矢量图标以及支持浏览器自身解析的优点,很多团队都已经在使用了.这篇文章主要说明 ...
- css布局基础总结
前端css布局知识繁杂,实现方式多种多样.想写出高效.合理的布局,必须以深厚的css基础为前提.为了方便记忆和复习,将css布局要点记录如下.内容较多,应用方面说的不太详细,但都是很实用的点. 所谓布 ...
- mybatis 实现分页和过滤模糊查询
基于 mybatis 的分页和过滤查询 学习内容: 分页设计 1.分页需传递的参数 2.分页需展示的数据 3.分页需展示的数据的来源 3.1.结果总数与结果集(分页原理) 3.2.总页数.上一页和下一 ...