Golang文件操作
1.文件介绍:文件是数据源,主要作用是保存数据
2.文件在程序中是以流的形式来操作的
对文件的操作主要用File(os包)结构体来实现
文件的基本操作
1)打开一个文件进行读操作:
os.Open(name string)(*File,error)
2)关闭一个文件
File.close()
案例:使用的函数和方法
func main(){
//打开文件
//概念说明:file的叫法
//1.file叫file对象
//2.file叫file指针
//3.file叫file文件句柄
file, err := os.Open("d:/text.txt")
if err != nil {
fmt.Println("oprn filr err=",err)
}
//输出下文件,可以看出文件就是个指针
fmt.Printf("file=%v",file)
//关闭文件
err = file.close()
if err != nil{
fmt.Println("close file err=",err)
}
}
读文件操作应用实例
1)读取文件的内容并显示在终端(带缓冲区的方式),使用os.Open,file.Close, bufio.NewReader(),reader.ReadString函数和方法
func main(){
//打开文件
//概念说明:file的叫法
//1.file叫file对象
//2.file叫file指针
//3.file叫file文件句柄
file, err := os.Open("d:/text.txt")
if err != nil {
fmt.Println("oprn filr err=",err)
}
//当函数退出时,请及时的关闭file
defer file.Close()//要及时关闭file句柄,否则会有内存泄漏
//创建一个*Reader,是指针类型带缓冲的
/*
const(defaultBufSize=4096)默认缓冲的缓存区为4096字节
*/
//有缓冲在读取文件的时候不是一次性把文件读入内存而是读一部分处理一部分,可以处理较大的文件
reader := bufio.NewReader(file)
//循环读取文件的内容
for {
str, err := reader.ReadString('\n')//读到一个换行就结束 ,将读取的内容存入str
if err == io.EOF {//io.EOF表示文件的末尾
break
}
//输出内容
fmt.Print(str)
}
fmt.Println("文件读取结束")
}
2)读取文件内容并显示在终端(使用ioutil一次将整个文件读入内存中),这种方式适用于文件不大的情况,相关方法和函数(ioutil.ReadFile)
func main(){
//这是使用ioutil.ReandFile一次性将文件读取到位
file := "d:/text.txt"
content,err := ioutil.ReadFile(file)
if err != nil{
fmt.Print("read file err=%v",err)
}
//把读取到的内容显示到终端
fmt.Printf("%v",content)//[]byte,输出的全是数字
fmt.Printf("%v",string(content))//转成string
}//这个方法并没有打开所以不用关闭。打开和关闭文件都被隐藏在ReadFile这个方法里
写文件操作应用实例
基本介绍-os.OpenFile函数
基本应用实例:方式一 注意写的时候用的是带缓存的Writer
(1)创建一个新文件,写入内容5句"hello,Gardon"
func main(){
//创建一个新文件,写入内容5句“hello,Gardon”
//1.打开文件
filePath := "d:/abc.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE, 0666)//0666在windows下面没有作用
if err != nil{
fmt.Printf("open file err=%v\n",err)
return
}
//关闭文件
defer file.Close()
//准备写入五句话“hello,Gardon”
str := "Hello, Gardon\n"
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0;i < 5;i++{
writer.WriteString(str)
}
//因为writer是带缓存,因此在调用这个writerString方法时,其实内容是先写入到缓存的
//所以需要调用Flush方法,将缓冲的数据真正写入文件中,否则文件中会丢失数据!!!!
writer.Flush()
}
(2)打开一个已经存在的文件中,将原来的内容覆盖成新的内容10句”你好,尚硅谷!“
func main(){
//打开一个已经存在的文件中,将原来的内容覆盖成新的内容10句“你好,尚硅谷!”
//1.打开一个已经存在的文件
filePath := "d:/abc.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_TRUNC, 0666)//0666在windows下面没有作用
if err != nil{
fmt.Printf("open file err=%v\n",err)
return
}
//关闭文件
defer file.Close()
//准备写入五句话“hello,Gardon”
str := "你好,尚硅谷!\r\n"
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0;i < 10;i++{
writer.WriteString(str)
}
//因为writer是带缓存,因此在调用这个writerString方法时,其实内容是先写入到缓存的
//所以需要调用Flush方法,将缓冲的数据真正写入文件中,否则文件中会丢失数据!!!!
writer.Flush()
}
(3)打开一个已经存在的文件,在原先的内容上追加内容‘ABC!ENGLISH!’
func main(){
//打开一个已经存在的文件,在原先的内容上追加内容'ABC! ENGLISH!'
//1.打开文件已经存在的文件
filePath := "d:/abc.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_APPEND, 0666)//0666在windows下面没有作用
if err != nil{
fmt.Printf("open file err=%v\n",err)
return
}
//关闭文件句柄
defer file.Close()
//准备写入五句话“hello,Gardon”
str := "ABC,ENGLISH\r\n"
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0;i < 10;i++{
writer.WriteString(str)
}
//因为writer是带缓存,因此在调用这个writerString方法时,其实内容是先写入到缓存的
//所以需要调用Flush方法,将缓冲的数据真正写入文件中,否则文件中会丢失数据!!!!
writer.Flush()
}
(4)打开一个存在的文件,将原来的内容读出显示在终端,并且追加5句”hello,北京!“
func main(){
//
//1.打开文件已经存在的文件
filePath := "d:/abc.txt"
file, err := os.OpenFile(filePath, os.RDWR | os.O_APPEND, 0666)//0666在windows下面没有作用
if err != nil{
fmt.Printf("open file err=%v\n",err)
return
}
//及时关闭文件句柄
defer file.close()
//先读取原来文件的内容并显示在终端
reader := bufio.NewReader(file)
for{
str, err := reader.ReadString('\n') //每读到一个换行符就代表是一行
if err == io.EOF{//如果到文件末尾就结束
break
}
//显示到终端
fmt.Print(str)
}
//追加五句“hello,北京”
str := "hello,北京\r\n"
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0;i < 10;i++{
writer.WriteString(str)
}
//因为writer是带缓存,因此在调用这个writerString方法时,其实内容是先写入到缓存的
//所以需要调用Flush方法,将缓冲的数据真正写入文件中,否则文件中会丢失数据!!!!
writer.Flush()
}
基本应用实例-方式二
package main
import (
"fmt"
"io/ioutil"
)
func main(){
//将d:/abc.txt文件内容导入到 e:/kkk.txt
//1.首先将d:/abc.txt内容读取到内存
//2.将读取到的内容写入e:/kkk.txt
file1Path := "d:/abc.txt"
file2Path := "e:/kkk.txt"
data, err := ioutil.ReadFile(file1Path)
if err != nil{
//说明读取文件有错误
fmt.Printf("read file err=%v",err)
return
}
err = ioutil.WriteFile(file2Path,data,0666)
if err != nil{
fmt.Printf("write file err=%v",err)
}
}
拷贝文件
注意:Copy函数是io包提供的(文件拷贝最好是同类型否则容易乱码)
//自己编写一个函数,接收两个文件路径 srcFileName dstFileName
func CopyFile(dstFileName string,srcFileName string)(written int64,err error){
srcFile,err := os.Open(srcFileName)//返回一个文件句柄
if err != nil {
fmt.Printf("open file err=%v\n",err)
}
defer srcFile.Close()
//通过srcfile,获取到Reader
reader := bufio.NewReader(srcFile)
//打开dstFileName(因为这个文件可能不存在需要创建,所以不能用open打开)
dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0666)//0666在windows下面没有作用
if err != nil{
fmt.Printf("open file err=%v\n",err)
return
}
//通过dstFile,获取到 Writer
writer := bufio.NewWriter(dstFile)
defer dstFile.Close()
return io.Copy(writer,reader)
}
func main(){
//将d:/flower.jpg 文件拷贝到 e:/abc.jPg
//1.调用CopyFile 完成文件拷贝
srcFile := "d:/flower.jpg"
dstFile := "e:/abc.jpg"
_, err := CopyFile(dstFile,srcFile)
if err == nil{
fmt.Printf("拷贝完成\n")
}else{
fmt.P/rintf("拷贝完成 err=%v\n",err)
}
}