golang文件操作-1

文件操作-1

文件的基本介绍:

文件的概念:

​ 文件,对我们不陌生,文件时数据源(保存数据的地方)的一种,不如大家经常使用的word文档,txt文档,excel文档·····都是文件,文件最主要的作用就是保存数据,它既可以保存一张图片也可以保存视频,声音等等

输入流和输出流

文件在程序中都是以流的形式来错做的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ODcfX1vf-1649059936589)(C:\Users\黑色\AppData\Roaming\Typora\typora-user-images\image-20220404093359722.png)]

:数据在数据源(文件)和程序(内存)之间经历的路径

输入流:数据从数据源(文件)到程序(内存)的路径

输出流:数据从程序(内存)到数据源(文件)的路径

os.File封装所有对文件相关操作,File是一个结构体

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDIJ54PT-1649059936591)(C:\Users\黑色\AppData\Roaming\Typora\typora-user-images\image-20220404093740780.png)]

打开文件和关闭文件

使用的函数和方法

func Open(name string)(file *File,err error)
Open打开一个文件用于读取,如果操作成功,返回的文件对象的方法可以用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError


func (f *File) Close () error
Close关闭文件f,是文件不能用于读写,它返回可能出现错误。

案例演示

package main
import (
	"fmt"
	"os"
)
func main(){
	//打开文件
	file , err := os.Open("d:/test.txt")
	if err!=nil{
		fmt.Println("open file err =",err)
	}
	//输出下文件,看看文件是什么,看出file就是一个指针*File
	fmt.Printf("file = %T",file)
	err = file.Close();//Close放回的是一个err
	if err !=nil{
		fmt.Println("close file err",err)
	}//有错误就输出
}

输出结果是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-akMrsGak-1649059936593)(C:\Users\黑色\AppData\Roaming\Typora\typora-user-images\image-20220404095210684.png)]

是一个os包下面的一个*File指针

读文件操作应用实例:

1)读文件的内容并显示在终端(带缓冲区的方式),使用os.Open,file.Clos,bufio.NewReader(),reader.ReadString函数和方法

代码实现:

package main
import (
	"bufio"
	"fmt"
	"io"
	"os"
)
func main(){
	//打开文件
	file , err := os.Open("d:/test.txt")
	if err!=nil{
		fmt.Println("open file err =",err)
	}
	//输出下文件,看看文件是什么,看出file就是一个指针*File
	fmt.Println("file = %T",file)



	defer file.Close()//最后关闭

	reader := bufio.NewReader(file)
	// file是上面的file , err := os.Open("d:/test.txt")
	//循环的读取文件的内容
	for{
		str , err := reader.ReadString('\n')//读取到了'\n'就结束一次
		if err == io.EOF{
			//io.EOF表示的错误是读取到了文件的末尾
			break
		}
		fmt.Print(str)
	}

	fmt.Println("文件读取结束~")
}

其中

defer file.Close()表示在程序最后执行

2)读文件的内容并显示在终端(使用ioutil一次将整个文件读如到内存中),这种方式适用于文件不大的情况。相关的方法和函数(ioutil.ReadFile)

代码演示:

package main

import (
	"fmt"
	"io/ioutil"
)

func main(){
	//使用ioutil.ReadFile一次性将文件读取到位
	file := "d:/test.txt"
	content ,err := ioutil.ReadFile(file)
	if err!= nil{
		fmt.Printf("read file err=%v",err)

	}
	//把读取到的内容显示到终端
	//fmt.Printf("%v",content)//[]byte content是一个byte数组
	fmt.Printf("%v\n",content)//打印出来的是数字utf-8表示的数字
	fmt.Printf("%v",string(content))
	//这个程序没有os.Open()那么就没有file.Close()
	//一次性就进行了读取,没有进行reader.ReaderString('\n')
}

写文件操作和应用实例

基本介绍os.OpenFile函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e1zhFSn1-1649059936594)(C:\Users\黑色\AppData\Roaming\Typora\typora-user-images\image-20220404105312409.png)]

参数说明:

第一个参数:name string表示的是file文件名

第二个参数:flag int表示的是打开模式

第三个参数:用户linux系统用于权限控制(windows没有用)

基本应用实例-方式一

1)创建一个新的文件,写入5巨话“hellow gardon”

代码实现

package main

import (
	"bufio"
	"fmt"
	"os"
)
func main(){
	//创建一个新的文件,写入内容
	filePath := "d:/abc.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)

		if err != nil{
			fmt.Printf("open file err=%v\n",err)
			return
		}
		defer file.Close();
	str :="HELLO GRADON~\n"
	writer := bufio.NewWriter(file)

	for i:=0;i<5;i++ {
		writer.WriteString(str)
		//写进去的是缓冲区
	}
	writer.Flush();//Flush方法将缓冲中的数据写入下层的io.Writer接口。
}

2)打开 一个存在的文件中,将原来的内容覆盖成新的内容10句“你好啊~”

代码实现:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main(){
	//打开这个文件
	filePath := "d:/abc.txt"
	file,err := os.OpenFile(filePath,os.O_WRONLY|os.O_TRUNC,0666)
	if err!=nil{
		fmt.Println("open file err=",err)
		return
	}
	defer file.Close()
	//有OpenFile就要有Close()
	//准备泻药写好的句子
	str := "你好啊~\n"
	//写入时,使用的是带缓存的*Writer
	writer := bufio.NewWriter(file)
	for i:=0;i<10;i++{
		writer.WriteString(str)
	}
	//内容是先写到带缓存的,所以需要调用Flush,将缓冲的数据
	//真正写道文件当中,否则文件中会没有数据
	writer.Flush();
}

3)打开一个存在的文件,在原来的内容追加内容“ABC-ENGLISH~”

需要时用的时os.O_APPEND

代码实现:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main(){
	//打开这个文件
	filePath := "d:/abc.txt"
	file,err := os.OpenFile(filePath,os.O_WRONLY|os.O_APPEND,0666)
    //append添加
	if err!=nil{
		fmt.Println("open file err=",err)
		return
	}
	defer file.Close()
	//有OpenFile就要有Close()
	//准备泻药写好的句子
	str := "你可真是一个小混蛋!!TMD~\n"
	//写入时,使用的是带缓存的*Writer
	writer := bufio.NewWriter(file)
	for i:=0;i<2;i++{
		writer.WriteString(str)
	}
	//内容是先写到带缓存的,所以需要调用Flush,将缓冲的数据
	//真正写道文件当中,否则文件中会没有数据
	writer.Flush();
}

基本应用实例-方式二

编程一个程序,将一个文件的内容写到另外一个文件。注:这两个文件已经存在了。

说明:使用ioutil.ReadFile/ioutil.WriteFile完成文件的任务

代码实现:

package main

import (
	"fmt"
	"io/ioutil"
)

func main(){
	//将d:abc.txt复制到d:kkk.txt文件中


	file1Path := "d:/abc.txt"
	file2Path := "d:/kkk.txt"
	//首先将d:abc.txt内容读取到内存
	date ,err := ioutil.ReadFile(file1Path)
	if err !=nil{
		//说明读取文件有错误
		fmt.Println("read file err = ",err)
		return
	}
	//开始写入文件
	//在将读取到的内容写入d:kkk.txt中
	err1 := ioutil.WriteFile(file2Path,date,0666)
	if err1 !=nil{
		fmt.Printf("write file error = %v\n",err)
	}
}

判断文件是否存在

golang判断文件或者文件夹是否存在的方法时使用 os.Stat() 函数放回的错误值进行判断:

  1. 如果放回的错误时nil,说明文件或者文件夹存在
  2. 如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或者文件夹不存在
  3. 如果返回的错误时其他的类型,则不确定时否存在

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tN49xphb-1649059936595)(C:\Users\黑色\AppData\Roaming\Typora\typora-user-images\image-20220404150407238.png)]

使用一个函数使得用true和false来判断文件或者文件夹是否存在

函数:

func PathExists(path string)(bool ,error){
    _,err := os.Stat(path)
    if err == nil{//文件存在
        return true,nil
    }
    if os.IsNotExist(err){
        return false,nil
    }
    
    return false,err
}

文件编程应用实例

拷贝文件

说明:将一张图片/电影/MP3拷贝到零一个文件中 io包

func Copy(det Writer,src Reader)(written int64,err error)

Copy时io包提供的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UWNnabeo-1649059936596)(C:\Users\黑色\AppData\Roaming\Typora\typora-user-images\image-20220404152610198.png)]

代码实现:

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)
//自己编写一个程序,接收两个文件类路径srcFilePath和dstFilePath
//srcFilePath是文件的路径时一个字符串,
//但是进行了  srcFile := os.Open(srcFilePath)——>它就变成了一个
/*
1.file 叫做file对象
2.file 也可以叫做file指针
3.file也可以叫做file句柄
 */
func CopyFile(dstFileName string,srcFilePaht string)(written int64,err error){
	//打开一个文件
	srcFile , err01 := os.Open(srcFilePaht)
	if err01 != nil{
		fmt.Println("open file err =",err01)
		return
	}
	defer srcFile.Close()//关闭文件
	//通过srcfile获取reder
	reader :=bufio.NewReader(srcFile)

	//打开dstFilePath

	//目标destion文件
	dstFile,err02 := os.OpenFile(dstFileName,os.O_WRONLY|os.O_CREATE,0666)
	if err02 != nil{
		fmt.Printf("open file err=",err02)
		return
	}


	//通过dstFile获取Writer
	writter := bufio.NewWriter(dstFile)
	defer dstFile.Close()
	return io.Copy(writter,reader)
}

func main(){
	srcFile :="C:/Users/黑色/Pictures/Camera Roll/baby.jpg"
	dstFile :="d:/kk.jpg"
	_,err := CopyFile(dstFile,srcFile)
	if err== nil{
		fmt.Println("copy ok\n")
	}else{
		fmt.Println("copy err =",err)
	}
}
//实现了copy

统计英文、数字、空格和其他字符的数量

说明:统计一个文件含有的英文、数字,空格以及其他字符

代码实现

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

type Count struct{
	CharCount int
	NumCount int
	SpaCount int
	OtherCount int
}

func main(){
	filePath := "D:/其他/123.txt"
	file,err := os.Open(filePath)
	if err != nil{
		fmt.Println("open file err =",err)
		return
	}
	reader := bufio.NewReader(file)
	var count Count
	for{
		str,err:= reader.ReadString('\n')
		if err == io.EOF{
			break
		}
		//兼容中文必须将str转换编程一个rune切片
		str1 := []rune(str)

		for _,v := range str1{
			switch{
			case v>='a'&&v<='z':
				fallthrough
			case v>='A'&&v<='Z':
				count.CharCount++
			case v>='0'&&v<='9':
				count.NumCount++
			case v==' '||v =='\t':
				count.SpaCount++
			default:
				count.OtherCount++
			}
		}
	}

	fmt.Printf("英文:%v个  数字:%v个   空格:%v个   其他:%v个",
		count.CharCount,count.NumCount,count.SpaCount,count.OtherCount)
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7fc0iFP-1649059936598)(C:\Users\黑色\AppData\Roaming\Typora\typora-user-images\image-20220404160835475.png)]

une(str)

	for _,v := range str1{
		switch{
		case v>='a'&&v<='z':
			fallthrough
		case v>='A'&&v<='Z':
			count.CharCount++
		case v>='0'&&v<='9':
			count.NumCount++
		case v==' '||v =='\t':
			count.SpaCount++
		default:
			count.OtherCount++
		}
	}
}

fmt.Printf("英文:%v个  数字:%v个   空格:%v个   其他:%v个",
	count.CharCount,count.NumCount,count.SpaCount,count.OtherCount)

}


运行结果:

[外链图片转存中...(img-s7fc0iFP-1649059936598)]







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值