Golang文件操作

1.文件介绍:文件是数据源,主要作用是保存数据

2.文件在程序中是以流的形式来操作的

对文件的操作主要用File(os包)结构体来实现

文件的基本操作

1)打开一个文件进行读操作:

os.Open(name string)(*File,error)

2)关闭一个文件

File.close()

案例:使用的函数和方法

Go 复制代码
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函数和方法
Go 复制代码
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)
Go 复制代码
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"
Go 复制代码
 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句"你好,尚硅谷!"
Go 复制代码
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!'
Go 复制代码
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,北京!"
Go 复制代码
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()
}

基本应用实例-方式二

Go 复制代码
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包提供的(文件拷贝最好是同类型否则容易乱码)

Go 复制代码
//自己编写一个函数,接收两个文件路径 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)    
    }
   
}
相关推荐
传奇开心果编程1 分钟前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
Bruce_Liuxiaowei5 分钟前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
IT_陈寒11 分钟前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
光影少年22 分钟前
Express 中间件原理
后端·node.js·express
aramae1 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
徐小夕2 小时前
存量.doc 文档怎么办?JitWord 开源转换库打通旧文档到在线协同全链路
后端·架构·github
ee又momo2 小时前
一次 JWT Token 过期续期的踩坑记录
后端
五彩小白2 小时前
GO语言装饰器语法
golang
二月龙2 小时前
App 瘦身实战:图片、so 库、资源压缩,安装包体积减小 40%
后端
大勇前进2 小时前
Kotlin 协程实战避坑:90% 的人都会踩的生命周期泄漏问题
后端