Go语言学习之文件操作方法详解

目录
  • 引言
  • 1. 打开和关闭文件
  • 2. 读取文件
    • 2.1 defer 语句
    • 2.2 手动宕机处理
    • 2.3 打开文件并获取内容
    • 2.4 bufio 读取文件
    • 2.5 ioutil 读取文件
    • 2.6 读取奇偶行内容
  • 3. 写入文件
    • 3.1 os.OpenFile() 函数
    • 3.2 Write 和 WriteString 方式写入
    • 3.3 bufio.NewWriter 方式写入
    • 3.4 ioutil.WriteFile 方式写入

引言

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

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语言文件操作的资料请关注我们其它相关文章!

(0)

相关推荐

  • Golang二进制文件混淆保护操作

    Go实在是太棒了.一处编译,处处运行,没有依赖,毫无麻烦! 不过麻烦的事情来了.我们写一个程序,就是想在别人的电脑上运行的.然而,Go语言的默认机制,会泄漏我们的一些信息,虽然不多,但也有点尴尬. 本文结合网上的一些常用方法,总结出一套通用的简单易行的保护措施. 减少 golang 二进制文件大小 1.删除调试符号 默认情况下go编译出的程序在运行出错时会输出自己在哪个线程哪个文件哪个函数哪行出的错,就像这样, 图片来源StackOverflow DWARF信息对于小黑客们可是如获至宝,这些关键

  • Go语言的文件操作代码汇总

    # 建立与打开文件 // 新建文件可以通过如下两个方法: func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666的文件,返回的文件对象是可读写的. func NewFile(fd uintptr, name string) *File 根据文件描述符创建相应的文件,返回一个文件对象 // 通过如下两个方法来打开文件: func Open(name string) (file *File,

  • Goland 生成可执行文件的操作

    返回主页Goland通过调用go build 生成可执行文件. 默认Goland是可以执行程序,但你找不到可执行文件. 你需要自定义配置文件. 创建go build配置文件 Run kind 选Directory Directory 选你的main包所在文件夹 Output directory设置与go build -o 不相容,所以不用设置,我们使用-o参数来控制可执行文件的路径以及名字 Working directory保持默认就好 Go tool arguments 就是go build

  • GO文件创建及读写操作示例详解

    目录 三种文件操作比较 ioutil ioutil.ReadFile读 ioutil.WriteFile 写 ioutil.ReadAll 读 ioutil.ReadDir 查看路径下目录信息 ioutil.TempDir 创建临时目录 ioutil.TempFile 创建临时文件 os.file 方法 os.OpenFile() 创建文件 写入数据三种方式 第一种-WriteString( )函数 第二种-Write( )函数 第三种-WriteAt( )函数 读取文件 Read 读取文件 按

  • Go语言文件操作的方法

    本文实例讲述了Go语言文件操作的方法.分享给大家供大家参考.具体如下: 关闭文件: 复制代码 代码如下: func (file *File) Close() os.Error {     if file == nil {         return os.EINVAL     }     e := syscall.Close(file.fd)     file.fd = -1 // so it can't be closed again     if e != 0 {         retu

  • GO语言ini配置文件的读取的操作

    iniconf 博主前两天在写一个小的go语言项目,想找一个读取ini格式配置和的三方库,在网上找了一圈感觉都不是很好用, 使用起来非常的奇怪,于是自己写了一版,还有两个接口没有实现,在项目中修改或删除配置项后更新到文件中,等待后续有时间了再写,希望用的朋友感觉不错点个赞 github 地址 描述 使用iniconf更简单的读取go的ini配置文件以及根据特定格式的各种配置文件. 安装方法 go get github.com/clod-moon/goconf 使用方法 ini配置文件格式样列 [

  • Go语言学习之文件操作方法详解

    目录 引言 1. 打开和关闭文件 2. 读取文件 2.1 defer 语句 2.2 手动宕机处理 2.3 打开文件并获取内容 2.4 bufio 读取文件 2.5 ioutil 读取文件 2.6 读取奇偶行内容 3. 写入文件 3.1 os.OpenFile() 函数 3.2 Write 和 WriteString 方式写入 3.3 bufio.NewWriter 方式写入 3.4 ioutil.WriteFile 方式写入 引言 计算机的文件是存储再外部介质(硬盘)上的数据集合,文件分为文本文

  • C语言中的文件操作详解

    目录 1.为什么使用文件 2.什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3.文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 4.文件的顺序读写 5.文件的随机读写 5.1fseek 5.2ftell 5.3rewind 6.文本文件和二进制文件 7.文件读取结束的判定 7.1被错误使用的feof 8.文件缓冲区 结论 1.为什么使用文件 在学习结构体时,写了一个简易的通讯录的程序,当程序运行起来的时候,可以在通讯录中增加和删除数据,此时数据是存放在内存当中的,当程序退出

  • Go语言学习之运算符使用详解

    目录 1.算术运算符 2.关系运算符 3.逻辑运算符 4.位运算符 5.赋值运算符 6.特殊运算符 1.算术运算符 很常规,和java一样. 样例代码如下 // 算术运算符 func base() { a := 1 b := 20 c := 31 d := -1 fmt.Printf(" + -> %d\n", a+b) fmt.Printf(" - -> %d\n", b-a) fmt.Printf(" * -> %d\n",

  • Go语言学习之WaitGroup用法详解

    目录 前言 小试牛刀 总览 底层实现 结构体 Add Done Wait 易错点 总结 前言 在前面的文章中,我们使用过 WaitGroup 进行任务编排,Go语言中的 WaitGroup 和 Java 中的 CyclicBarrier.CountDownLatch 非常类似.比如我们有一个主任务在执行,执行到某一点时需要并行执行三个子任务,并且需要等到三个子任务都执行完后,再继续执行主任务.那我们就需要设置一个检查点,使主任务一直阻塞在这,等三个子任务执行完后再放行. 说明:本文中的示例,均是

  • C语言学习之柔性数组详解

    目录 一.前言 二.柔性数组的用法 三.柔性数组的内存分布 四.柔性数组的优势 五.总结 一.前言 仔细观察下面的代码,有没有看出哪里不对劲? struct S { int i; double d; char c; int arr[]; }; 还有另外一种写法: struct S { int i; double d; char c; int arr[0]; }; 你应该一眼就看到了,结构体的最后一个成员数组的写法是int arr[];或者是int arr[0],这两种写法是等价的,意思是这个数组

  • C#中File类的文件操作方法详解

    本文实例讲述了C#中File类的文件操作方法.分享给大家供大家参考.具体分析如下: File类,是一个静态类,主要是来提供一些函数库用的.静态实用类,提供了很多静态的方法,支持对文件的基本操作,包括创建,拷贝,移动,删除和打开一个文件.File类方法的参量很多时候都是路径path.File的一些方法可以返回FileStream和StreamWriter的对象.可以和他们配套使用. System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用S

  • Python文件操作方法详解

    本节内容 1.文件常用操作汇总 2.打开文件 3.操作文件 4.关闭文件 一.文件常用操作汇总 二.打开文件 1.普通打开模式 r,英文:read,只读模式(默认) w,英文:write,只写模式(不可读,不存在则创建新文件,存在则删除内容) a,英文:append,追加模式(不可读,不存在则创建,存在则只追加内容 2.同时读写模式 r+,可读写文件(可读:可写:可追加,不存在文件则报错) w+,可写读文件(可读,可写,创建新文件) a+,可追加和读文件(可读,可追加,不存在则创建) 3.二进制

  • C语言进阶之文件操作详解

    目录 0.Intro 1.文件名 2.文件的打开和关闭 2.1文件指针 2.2打开和关闭文件 3.文件顺序读写 3.1利用以上函数实现拷贝文件操作 3.2二进制的读写 3.3格式化输入输出函数 4.文件的随机读写操作 4.1fseek 4.2ftell 4.3rewind 5.文本文件和二进制文件 5.1一个数据在内存中的存储方式 6.文件读取错误的判定 6.1被错误使用的feof 7.文件缓冲区 7.1行缓冲 总结 0. Intro 在使用操作数据库之前,记录信息,录入数据需要文件操作,这样就

  • R语言操作文件方法详解教程

    目录 1. 文件与文件夹列表的读取 2. 新建文件与文件夹 3. 文件与文件夹的删除 4. 查看文件与文件夹是否存在 小练习 由于最近在处理一些真实数据时涉及到嵌套的 .tar.gz 文件的解压,手动一个一个解压过于麻烦.可以使用 shell 脚本或者 bat 脚本来做,但想尝试使用 R 语言对其进行完全解压,这里就需要涉及到对文件与文件夹的一些操作. 网上已经有许多现有教程,这里参考了很多网上的代码,不过会尝试尽量写得更加详细. 整篇文章我们的测试目录结构如下(生成目录结构树,可以直接在当前路

  • Python对PDF文件的常用操作方法详解

    目录 工具 从PDF中提取文本 旋转和叠加页面 加密PDF文件 创建PDF文件 补充 工具 python3.7 Pycharm PDF PyPDF2 reportlab 从PDF中提取文本 PyPDF2没有办法从PDF文档中提取图像.图表或其他媒体,但它可以提取文本,并将其返回为Python字符串. import PyPDF2 reader = PyPDF2.PdfFileReader('test.pdf') page = reader.getPage(0) print(page.extract

随机推荐