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)    
    }
   
}
相关推荐
世间万物皆对象25 分钟前
Java 基础教学:高级特性与实战-集合框架
java·开发语言
不爱吃米饭_29 分钟前
如何优雅处理异常?处理异常的原则
java·开发语言·spring boot
豆本-豆豆奶1 小时前
给初学者的 Jupyter Notebook 教程
开发语言·python·jupyter·安装教程·notebook
K1t01 小时前
dns欺骗
开发语言·网络·php
AiFlutter1 小时前
Java对接GraphQL
java·开发语言·graphql
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
springboot单元测试配置
spring boot·后端·单元测试
掘金狂热勇士1 小时前
GCC 编译过程的三个阶段
后端
技术拾荒者2 小时前
.net core mvc 控制器中页面跳转
后端·c#·asp.net·mvc·.netcore
写bug写bug2 小时前
Git 中的撤销工作区、暂存区和已提交的更改
前端·git·后端
Aliano2172 小时前
Java的jackson库
java·开发语言