Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag

Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag,第1张

Create创建文件:

os.Create:文件不存在则创建,文件存在则删除文件中的内容

语法:

file:创建文件的指针
err:创建文件出现异常后的信息

file, err := os.Create("创建文件存放的路径")

演示:

func CreateFile() {
	file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")
	if err != nil {
		fmt.Println(err)
	}
	
	// 关流(不关流会长时间占用内存)
	defer file.Close()
}
写入数据:

使用WriteString写数据:

WriteString底层也是调用的Write,但是Write需要转换字节数组,比较麻烦,WriteString不需要手动转换,比较方便

func FileWriteString() {
	// 创建文件
	file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")
	if err != nil {
		fmt.Println(err)
	}

	defer file.Close()

	// WriteString写数据,返回值参数1是写的字符长度,参数2是异常信息
	len, err := file.WriteString("WriteString写入的数据")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(len)
}

使用Write写数据:

func FileWrite() {
	// 创建文件
	file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")
	if err != nil {
		fmt.Println(err)
	}

	defer file.Close()

	// Write写数据,返回值参数1是写的字符长度,参数2是异常信息
	str := "Write写入的数据"
	len, err := file.Write([]byte(str)) //将字符串转换成字节切片
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(len)
}

使用WriteAt写数据:在指定的位置写入数据

func FileWriteAt() {
	// 创建文件
	file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")
	if err != nil {
		fmt.Println(err)
	}

	defer file.Close()

	// WriteAt写数据,返回值参数1是写的字符长度,参数2是异常信息
	// WriteAt写数据,参数列表中参数1是要写的数据,参数2是要写入数据的开始索引
	var str string = "WriteAt写入的数据"
	num, _ := file.Seek(0, io.SeekEnd) //SeekEnd:将数据追加到源文件,参数一:追加数据的开始索引,
	fmt.Println("num:", num)
	len, err := file.WriteAt([]byte(str), num)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(len)
}
OpenFile追加数据:
文件里已经有数据的情况下,用上面的三种方式去写,会出现覆盖的效果,WriteAt可以指定索引,但是比较麻烦。

os.OpenFile():打开指定文件进行 *** 作

OpenFile有三个参数:参数1:打开文件的路径参数2:模式,常见的模式有
参数说明
O_RDONLY只读方式打开
O_WRONLY只写方式打开
O_RDWR读写方式打开
O_APPEND追加方式打开
O_CREATE不存在,则创建
O_EXCL如果文件存在,且标定了O_CREATE的话,则产生一个错误
O_TRUNG如果文件存在,且它成功地被打开为只写或读写方式,将其长度裁剪唯一(覆盖)
O_NOCTTY如果文件名代表一个终端设备,则不把该设备设为调用进程的控制设备
O_NONBLOCK如果文件名代表一个FIFO,或一个块设备,字符设备文件,则在以后的文件及I/O *** 作中置为非阻塞模式
O_SYNC当进行一系列写 *** 作时,每次都要等待上次的I/O *** 作完成再进行
参数3:表示权限,取值范围(0-7),和linux里 *** 作文件那个读写一样

0:没有任何权限
1:执行权限(如果是可执行文件,是可以运行的)
2:写权限
3:写权限与执行权限
4:读权限
5:读权限与执行权限
6:读权限与写权限
7:读权限,写权限,执行权限

演示:

func OpenFileTest() {
	// 追加写数据
	file, err := os.OpenFile("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt", os.O_APPEND|os.O_WRONLY, 6)
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	// 通过文件指针读写数据
	len, err := file.WriteString("\t我追加了吗")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(len)
}
Open读取文件:

读取指定文件的数据

演示:

func OpenFileTest2() {
	// 追加写数据
	file, err := os.Open("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	// 读数据,定义一个切片存储文件读取的数据
	buffer := make([]byte, 1024)
	len, err := file.Read(buffer)// len:读取文件中的数据长度
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(len)
	//fmt.Println(buffer) // 直接打印都是数字(ascii码值),长度是1024,数据没满的时候就会用默认值0代替,可以使用截取 *** 作
	fmt.Println(buffer[:len])
	fmt.Println(string(buffer[:len])) // 将类型转换为string,可以展示出内容
}
ReadBytes缓冲区读取:

在使用ReadBytes( )函数读取数据时,需要用到缓冲区,所谓缓冲区就是存储数据的区域,也就是先将从文件中读取的数据存储在该区域内,然后在将区域中的数据取出来,写到磁盘上。

提供缓冲区的原因是:

为了缓和 CPU 与 磁盘设备之间速度不匹配矛盾。文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。

演示:

func ReadBytesTest() {
	// 追加写数据
	file, err := os.Open("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	// 读数据,定义一个切片存储文件读取的数据
	r := bufio.NewReader(file)

	for {
		buf, err := r.ReadBytes('\n')
		if err == io.EOF { // io.EOF是io包中的变量, 表示文件结束的错误:
			break
		}
		fmt.Println(err)
		fmt.Println("buf", string(buf))
	}
}
os.Args:

os.Args是一个string的切片,可以存储所有的命令行参数

package main

import (
	"fmt"
	"os"
)

func main() {
	// 获取命令行参数,第0个参数是文件本身,后面的是启动可执行文件后传入的参数
	args := os.Args

	// 因为规定了上传文件需要携带至少一个的文件路径,所以需要在这里判断一下上传的文件数是否满足格式
	if len(args) != 2 {
		fmt.Println("格式为:go run 可执行文件名.go 文件名")
		return
	}

	//提取文件名
	path := args[1]
	// 获取文件属性
	stat, err := os.Stat(path)
	if err != nil {
		fmt.Println("os.Stat 出错了:", err)
		return
	}
	fmt.Println("文件名:", stat.Name())
	fmt.Println("文件名:", stat.Size())
}

执行结果:

itzhuzhu@itzhuzhudeMacBook-Pro ~ % go run /Users/itzhuzhu/Desktop/goCode/basics/src/day08/命令行参数.go /Users/itzhuzhu/Desktop/产品经理自学路线图.jpeg
文件名: 产品经理自学路线图.jpeg
文件名: 588986
itzhuzhu@itzhuzhudeMacBook-Pro ~ % 
flag:

flag包实现了命令行解析,使用Args拿到命令行参数如果不是按照顺序写的就会有问题,可以使用flag解析,指定名称然后带参数,类似于mysql登录的时候写-u -p一样

func listFiles6() {
	var user string
	var password string
	var host string
	var port int
	/**
	参数1:设置对应的标签名,可以通过该标签名来或得对应值
	参数2:如果没有设置该标签,则采用这个值即该值为默认值
	参数3:这个参数为帮助信息,一般用于help调用展示

	&user:接收用户命令行中输入的 -u 后面的参数
	"u":-u的参数
	"":默认值
	"用户名默认为空":提示说明
	*/
	flag.StringVar(&user, "u", "", "用户名默认为空")
	flag.StringVar(&password, "p", "", "密码默认为空")
	flag.StringVar(&host, "h", "localhost", "主机名默认为localhost")
	flag.IntVar(&port, "port", 8000, "端口号默认8000")
	// Parse:从args中解析注册的flag。也就是转换的
	flag.Parse()
	fmt.Printf("user=%v password=%v host=%v port=%v\n", user, password, host, port)
}

执行结果:

itzhuzhu@itzhuzhudeMacBook-Pro day06 % go run 文件 *** 作.go -u root -p ppp -h 127.0.0.1 -port 3306
user=root password=ppp host=127.0.0.1 port=3306

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/989838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存