当前位置: 首页 > article >正文

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)    
    }
   
}


http://www.kler.cn/a/376329.html

相关文章:

  • 萤火虫算法优化BILSTM神经网络多输入回归分析
  • Axure使用动态面板制作新闻栏目高级交互
  • Cuda By Example - 12 (Texture Memory)
  • 贪心算法习题其二【力扣】【算法学习day.19】
  • 刘艳兵-DBA016-在您的数据库中,SALES表存在于SH用户中,并且启用了统一审计。作为DBA,您成功执行了以下指令:
  • WPF+MVVM案例实战(十)- 水波纹按钮实现与控件封装
  • python开发工具是选择vscode还是pycharm?两款软件优缺点对照!
  • 电商领域软件系统实战:基于TiDB的分布式数据库应用
  • 求最大公约数,最小公倍数
  • 集成旺店通旗舰版售后单至MySQL数据库
  • leetcode-88-合并两个有序数组
  • 江协科技STM32学习- P33 实验-软件I2C读写MPU6050
  • 【攻防实战】手把手带你打穿某集团内网(上)
  • RTX5/FreeRTOS全家桶源码工程综合实战模板集成CANopen组件(2024-10-30)
  • IT界的大神-003- 史蒂夫·乔布斯 (Steve Jobs)
  • 字体反爬 fontTools | ddddocr
  • 高德地图如何标注店铺名称和位置信息?
  • timm使用笔记
  • 20221403郑骁恒第八周预习报告
  • 基于单片机的智能婴儿监控系统设计(论文+源码)
  • Istio基本概念及部署
  • Vue Router 中 router、route 和 routes 的区别 - 2024最新版前端秋招面试短期突击面试题【100道】
  • 深度学习速通系列:如何使用bert进行超长中文文本命名实体识别
  • Jupyter lab 打开时默认使用 Notebook 而不是浏览器
  • springboot-starter 整合feignClient
  • 方差与协方差