一文搞懂Go语言中文件的读写与创建

目录
  • 1. 文件的打开与关闭
    • 1.1 os.open
    • 1.2 os.OpenFile() 指定模式打开文件
  • 2. 文件的读取
    • 2.1 打开文件的方式读取文件中的数据
    • 2.2 使用 bufio 整行读取文件
  • 3. 写入文件操作
    • 3.1 file.Write 与 file.WriteString
    • 3.2 bufio.NewWriter
    • 3.3 ioUtil 工具类

1. 文件的打开与关闭

1.1 os.open

os.open 函数能打开一个文件 调用 close() 方法 关闭文件

	//打开文件
	open, err := os.Open("./1.text")

	if err != nil {
		//打印异常信息
		fmt.Println("open file err", err)
	}

	fmt.Println("文件获取完毕")

	//没有出现异常,关闭文件
	open.Close()

为了防止忘记关闭文件,通常都将关闭文件的代码写在 defer中

	//打开文件
	open, err := os.Open("./1.text")

	defer func() {
		if open != nil {
			// 关闭文件
			open.Close()
		}
	}()

	if err != nil {
		//打印异常信息
		fmt.Println("open file err", err)
	}

	fmt.Println("文件获取完毕")

1.2 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。

2. 文件的读取

2.1 打开文件的方式读取文件中的数据

//首先需要打开一个文件
	open, err := os.Open("./1.text")
	defer func() {
		e := recover()
		if e != nil {

			fmt.Println("打开文件出现了异常", e)
		}
	}()

	if err != nil {
		// 如果有异常  没必要往下走了  抛出
		panic(err)
	}

	//如果没有异常
	//创建 字节切片
	bytes := make([]byte, 1024)

	defer func() {
		e := recover()
		if e != nil {

			fmt.Println("读取文件出现了异常", e)
		}
	}()

	for {
		//循环读
		_, err := open.Read(bytes)

		if err != nil {
			panic(err)
		}

		//打印结果
		fmt.Println(string(bytes))
	}

2.2 使用 bufio 整行读取文件

bufio 是在file的基础上封装了一层API , 支持更多的功能

	//同样的首先打开一个文件
	file, err := os.Open("./1.text")

	defer recover()

	if err != nil {
		panic("文件打开出现异常")
	}

	// 封装为 bufio
	reader := bufio.NewReader(file)

	defer recover()

	for {

		//读到指定字符串换一行
		line, _, err := reader.ReadLine()

		if err != nil {
			if err == io.EOF {
				fmt.Println("文件读写完毕")
				break
			}
			panic("文件读取出现异常")
		}

		fmt.Println(string(line))
	}

	fmt.Println("程序运行结束")
func main() {
	file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
}

3. 写入文件操作

无论是文件读取还是文件写入 都是需要先打开文件 再进行操作

3.1 file.Write 与 file.WriteString

// 首先打开文件  O_RDWR  读写权限  O_TRUNC  清空文件  0 开头表示八进制 666表示 当用用户 当前组  其他用户 都是可读可写权限
	file, err := os.OpenFile("1.text", os.O_RDWR|os.O_TRUNC, 0666)
	if err != nil {
		fmt.Printf("打开文件出现异常 %v", err)
	}

	defer file.Close()

	// 返回 写入的字节数
	write, err := file.Write([]byte("测试文件写入 \n"))
	file.WriteString("一次写入整个字符串")

	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(write)

3.2 bufio.NewWriter

// 基于缓存操作
	file, err := os.OpenFile("2.text", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	if err != nil {
		panic(err)
	}

	defer func() {
		file.Close()
		if e := recover(); e != nil {
			fmt.Printf("异常 : 打开文件出现异常 %v", e)
		}
	}()

	// 使用 bufio 基于缓存操作io流
	// 需要传入 一个 io 接口包下的 Writer 接口实现类 而 file 实现了该 方法

	writer := bufio.NewWriter(file)

	writer.WriteString(" 写入缓存字符串内容 2")

	//需要将缓存中的数据刷新到硬盘上
	writer.Flush()

3.3 ioUtil 工具类

	// 使用工具类  打开文件,写入文件一气呵成
	err := ioutil.WriteFile("3.text", []byte("工具类写入内容"), 0666)

	if err != nil {
		fmt.Println("程序运行出现异常", err)
	}

到此这篇关于一文搞懂Go语言中文件的读写与创建的文章就介绍到这了,更多相关Go语言 文件读写 创建内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang简单读写文件示例

    本文实例讲述了golang简单读写文件的方法.分享给大家供大家参考,具体如下: 这里演示golang读写文件的方法: 复制代码 代码如下: package main import (     "fmt"     "os" ) func main() {     f, err := os.OpenFile("file2.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0x644)     if err !=

  • Golang实现文件夹的创建与删除的方法详解

    目录 创建文件夹 删除文件和文件夹 小结 学习笔记,写到哪是哪. 接着上一篇对纯文本文件读写操作,主要去实现一些文件夹操作. 创建文件夹 创建文件夹的时候往往要先判断文件夹是否存在. 样例代码如下 package main import ( "bufio" "fmt" "io" "os" ) //判断文件夹是否存在 func HasDir(path string) (bool, error) { _, _err := os.S

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

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

  • Go语言编程中对文件读写的基本方法整理

    1.func Copy(dst Writer, src Reader) (written int64, err error)这个函数是从一个文件读取拷贝到另外一个文件,一直拷贝到读取文件的EOF,所以不会返回io.EOF错误,参数是写入目标器和读取目标器,返回int64的拷贝字节数和err信息 复制代码 代码如下: import (  "fmt"  "io"  "os" ) func main() {  r, _ := os.Open("

  • Go语言学习笔记之文件读写操作详解

    目录 文件写 文件读 小结 文件操作比较多,分为几篇来写吧.首先是文件的读写,在平时的工程化操作中使用最多. 文件写 样例代码如下 package main import ( "bufio" "fmt" "io" "os" ) //写文件 func DoWriteFile() error { _filePath := "./test.txt" _file, _err := os.OpenFile(_file

  • GO语言文件的创建与打开实例分析

    本文实例分析了GO语言文件的创建与打开用法.分享给大家供大家参考.具体分析如下: 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的.Golang 对文件的支持是在 os package 里,具体操作都封装在 type File struct {} 结构体中. 一.func Open(name string) (file *File, err error) 再简单不过了,给一个路径给它,返回文件描述符,如果出现错误就会返回一个 *PathError. 这是一个只读打开模式,实

  • 一文搞懂Go语言中文件的读写与创建

    目录 1. 文件的打开与关闭 1.1 os.open 1.2 os.OpenFile() 指定模式打开文件 2. 文件的读取 2.1 打开文件的方式读取文件中的数据 2.2 使用 bufio 整行读取文件 3. 写入文件操作 3.1 file.Write 与 file.WriteString 3.2 bufio.NewWriter 3.3 ioUtil 工具类 1. 文件的打开与关闭 1.1 os.open os.open 函数能打开一个文件 调用 close() 方法 关闭文件 //打开文件

  • 一文搞懂Go语言中条件语句的使用

    目录 if语句 if...else 语句 if 语句嵌套 switch 语句 Type Switch fallthrough select 语句 条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. Go 语言提供了以下几种条件判断语句: 语句 描述 if 语句 if 语句 由一个布尔表达式后紧跟一个或多个语句组成. if...else 语句 if 语句 后可以使用可选的 else 语句, else 语

  • 一文搞懂C语言static关键字的三个作用

    目录 static修饰局部变量 static 修饰全局变量 static 修饰函数 总结 static修饰局部变量 图一:test 函数里面定义的 a 是局部变量,局部变量在栈区上开辟空间,栈区的使用特点是进入变量的生命周期时自动为其开辟空间,离开变量的生命周期时自动销毁对应空间,所以这里每次调用 test 函数时 a 都会被重新定义并初始化为0,所以屏幕上打印的是10个1: 图二:我们把 a 用 static 修饰后发现屏幕打印的是1到10,就好像每次调用完 test 函数后 a 并没有被销毁

  • 一文搞懂Go语言操作Redis的方法

    目录 前言 安装依赖包 连接redis redis连接池 总结 前言 Redis是一个开源的内存数据库,在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用.感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助. 安装依赖包 Go语言中使用第三方库go-redis go-redis支持连接哨兵及集群模式的Redis. 使用以下命令下载并安装: go get -u github.com/go-redis/redis/v8 连接redis 新建go文件,在项目中引入

  • 一文搞懂JMeter engine中HashTree的配置问题

    目录 一.前言 二.HashTree的用法 三.JMeter源码导出jmx脚本文件介绍 四.自定义HashTree生成JMeter脚本 一.前言 之前介绍了JMeter engine启动原理,但是里面涉及到HashTree这个类结构没有给大家详细介绍,这边文章就详细介绍JMeter engine里面的HashTree结构具体用来做什么 大家看到下面是JMeter控制台配置截图,是一个标准的菜单形式:菜单形式其实就类似于"树型"的数据结构,而HashTree其实就是一个树型数据结构 我们

  • 一文搞懂Java项目中枚举的定义与使用

    目录 什么是枚举 为什么需要枚举类 枚举类的定义和使用 什么是枚举 最近写新项目!有很多数据字典常量需要定义和使用.就顺便记录一下.什么是枚举类呢?就是用enum修饰是一种Java特殊的类,枚举是class.底层是继承了java.lang.Enum类的实体类.使用枚举可以很方便的定义数据常量.方便清晰我们使用 为什么需要枚举类 下面就举例说明一下吧 1)出于类型安全考虑,没用枚举类之前,常用静态常量来表示. 比如对于性别的表示: public static final int WOMAN = 0

  • 一文搞懂 React 18 中的 useTransition() 与 useDeferredValue()

    目录 前言 什么是Concurrent React? 设置项目 实现 useTransition() isPending 是做什么的? 前言 React 18 引入了一个关键的新概念,称为“Concurrent”. 并发涉及同时执行多个状态更新,这可以说是 React 18 中最重要的特性.除了并发之外,React 18 还引入了两个新的钩子,称为 useTransition() 和 useDeferredValue() 钩子. 它们都有助于降低状态更新的优先级,但问题是,何时应该使用它们? 什

  • 一文搞懂Spring Bean中的作用域和生命周期

    目录 一.Spring Bean 作用域 singleton(单例) prototype(原型) 小结 二.Spring Bean生命周期 如何关闭容器 生命周期回调 通过接口设置生命周期 通过xml设置生命周期 一.Spring Bean 作用域 常规的 Spring IoC 容器中Bean的作用域有两种:singleton(单例)和prototype(非单例) 注:基于Web的容器还有其他种作用域,在这就不赘述了. singleton(单例) singleton是Spring默认的作用域.当

  • 一文搞懂Vue3.2中setup语法糖使用

    目录 前言 一.如何使用setup语法糖 二.data数据的使用 三.method方法的使用 四.watchEffect的使用 五.watch的使用 六.computed计算属性的使用 七.props父子传值的使用 八.emit子父传值的使用 九.获取子组件ref变量和defineExpose暴露 十.路由useRoute和useRouter的使用 十一.store仓库的使用 十二.await 的支持 十三.provide 和 inject 祖孙传值 前言 提示:Vue3.2 版本开始才能使用语

  • 一文详解C语言中文件相关函数的使用

    目录 一.文件和流 1.程序文件 2.数据文件 3.流 二.文件组成 三.文件的打开和关闭 1.文件的打开fopen 2.文件关闭fclose 四.文件的顺序读写 1.使用fputc和fgetc写入/读取单个字符 2.使用fputs和fgets写入/读取一串字符 3.使用fprintf和fscanf按照指定的格式写入/读取 4.使用fwrite和fread按照二进制的方式写入/读取 5.使用sprintf和sscanf将格式化数据和字符串互相转换(文件无关) 五.文件的随机读写 1.fseek(

随机推荐