1 Star 0 Fork 29

柚子 / notebook

forked from JustryDeng / notebook 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
[14]文件IO的处理、延迟调用.md 4.84 KB
一键复制 编辑 原始数据 按行查看 历史
JustryDeng 提交于 2023-05-08 11:32 . 规范命名文件夹

文件IO的处理、延迟调用


打开、创建文件

格式:

func OpenFile(name string, flag int, perm FileMode) (*File, error)
  • name:要打开的文件名

  • flag:打开的权限。其取值采用位指示器方式,参数值如下:

    • O_RDONLY:只读。必选项,与O_WRONLYO_RDWR三者选其一。

    • O_WRONLY:只写。必选项,与O_RDONLYO_RDWR三者选其一。

    • O_RDWR:读写。必选项,与O_RDONLYO_WRONLY三者选其一。

    • O_CREATE:(如果文件不存在,则)创建文件。

      注:如果文件存在,则打开文件。

    • O_TRUNC:截断文件。

      注:所谓截断,指的是如果文件存在内容,则清空内容。

  • perm:8进制文件权限位,与umask共同作用,决定最终文件权限位

  • *File:(可以简单的理解为)文件描述符。可用来操作文件。

  • error:错误信息,nil代表没有错误。

注:error是Go语言错误信息的数据类型,nil代表Go语言当中的空指针,error返回nil代表没有错误。

示例:

import (
	"fmt"
	"os"
)

func main() {
    // 创建并打开文件
	file, err := os.OpenFile("a.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
	if err != nil {
		fmt.Println("Failed to OpenFile", err)
		return
	}
	fmt.Println(file.Name())
}

File的相关方法、延迟调用(示例)

提示:

  • 在Go语言中,[]bytestring,可以互相强制转换(你只管使用强制转换,Go语言负责实现转换逻辑)
  • 当打开一个文件时,文件的读写位置默认指向文件的开头;写入数据时,读写位置也会跟着移动,当写完之后,读写位置就跑到最后面去了,如果此时你想读取文件内容的话,需要将读写位置调整至文件开头的
  • []byte

格式:

// 读取文件内容到b(b是自建缓冲区),返回读取的字节数和错误信息
func (f *File) Read(b []byte) (n int, err error)
  • f:对应的文件
  • b:读取文件时的数据缓冲区
  • n:已读取的字节总数
  • err:错误信息
  • []byte

格式:

// 将缓冲区b的内容写入文件中,返回写入成功的字节数和错误信息
func (f *File) Write(b []byte) (n int, err error)
  • f:对应的文件
  • b:要写入的数据内容
  • n:已写入的字节总数
  • err:错误信息
  • string

格式:

// Write的另一种实现形式,传递参数为字符串类型
func (f *File) WriteString(s string) (n int, err error)
  • f:对应的文件
  • b:要写入的数据内容
  • n:已写入的字节总数
  • err:错误信息
  • 调整读写位置

格式:

// 调整文件读写位置,返回调整的距离和错误信息
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
  • f:对应的文件

  • offset:(相对whence的)偏移量

  • whence:调整的位置

    • os.SEEK_SET:文件头

      示例:Seek(0, os.SEEK_SET):调整至文件的开始位置

      示例:Seek(10, os.SEEK_SET):调整至从文件开始(index=0)位置(往右)偏移10个字节的位置处(即:index=10位置处,即:第11个字节位置处)

    • os.SEEK_CUR:当前位置

    • os.SEEK_END:结束位置 示例:Seek(0, os.SEEK_END):调整至文件的结束位置

  • ret:调整的距离

  • err:错误信息

示例:

import (
	"fmt"
	"os"
)

func main() {
	// 创建并打开文件
	file, err := os.OpenFile("a.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
	if err != nil {
		fmt.Println("Failed to OpenFile", err)
		return
	}

	// 写入字符串
	writeByteCount, err := file.WriteString("Hello world\n")
	if err != nil {
		fmt.Println("Failed to WriteString", err)
		return
	}
	fmt.Printf("write success %d bytes\n", writeByteCount)

	// 调整文件读写位置,并读取文件内容
	file.Seek(0, os.SEEK_SET)
	buf := make([]byte, writeByteCount)
	_, err = file.Read(buf)
	os.Stdout.Write(buf)

	/*
	 * 释放资源
	 * <br/>
	 * defer关键字的作用:
	 *    1. 被defer标识了的方法(或函数),会延迟到(defer所处)代码块退出前才进行调用。
	 *    2. 当程序要退出defer关键字所在的代码块(这里即main函数)时,会优先执行被defer标识了的方法(或函数),然后再退出defer关键字所在的代码块。
	 */
	defer file.Close()
}

输出:

write success 12 bytes
Hello world

相关资料

  • 《Go语言区块链应用开发从入门到精通》 高野 编著
1
https://gitee.com/WY784755850/notebook.git
git@gitee.com:WY784755850/notebook.git
WY784755850
notebook
notebook
master

搜索帮助