文章目录
文件操作-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() 函数放回的错误值进行判断:
- 如果放回的错误时nil,说明文件或者文件夹存在
- 如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或者文件夹不存在
- 如果返回的错误时其他的类型,则不确定时否存在
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]