Go语言入门(九) 文件操作

文件操作

文件的基本操作

读文件

func readFile(){
   filename :=  "./aaa.log"

   file, err := os.Open(filename)
   if err != nil {
      fmt.Printf("open %s is error,error %v\n",filename,err)
      return
   }
   //关闭文件句柄
   defer func() {
      file.Close()
   }()
   //读取文件
   var buf[4096]byte
   var content []byte
   for {
      n,err := file.Read(buf[:])
      if err != nil && err != io.EOF {
         fmt.Printf("Read %s failed,error %v\n",filename,err)
         return
      }
      //读取到文件末尾
      if err == io.EOF {
         break
      }
      validBuf := buf[0:n]
      //fmt.Printf("%s\n",string(validBuf))
      content = append(content,validBuf...)
   }
   fmt.Printf("content :%s\n",content)

}

func main() {
   readFile()
}
  • 使用bufio来提高文件读取的性能
func buffioRead() {
   //使用缓存的方式读取文件
   filename := "./aaa.log"
   file,err := os.Open(filename)
   if err != nil {
      fmt.Printf("read file %s faild,error :%v\n",filename,err)
      return
   }

   defer file.Close()

   reader := bufio.NewReader(file)

   var content []byte
   var buf [4096]byte

   for {
      n,err := reader.Read(buf[:])
      if err != nil && err != io.EOF {
         fmt.Printf("read %s failed,error is :%v\n",filename,err)
         return
      }
      //读取到文件末尾
      if err == io.EOF {
         break
      }
      validBuf := buf[0:n]
      content = append(content,validBuf...)
   }
   fmt.Printf("content :%s\n",content)

}

func main() {
   buffioRead()
}
  • ioutil文件读取整个文件: 读取小文件使用,比如配置文件需求
func ioutilRead(){
   filename := "./aaa.log"
   content,err := ioutil.ReadFile(filename)
   if err != nil {
      fmt.Printf("read file %s error :%v\n",filename,err)
      return
   }
   fmt.Printf("content %s\n",string(content))
}
  • 读取压缩文件
文件压缩: gzip -c 源文件 > 压缩文件.gz
目录压缩: gzip -r 目录
解压: gzip -d 压缩文件.gz
  • gz文件读取代码
func gzfileRead() {
   filename := "./aaa.gz"
   file,err := os.Open(filename)
   if err !=nil {
      fmt.Printf("can not open %s,err: %v\n",filename,err)
      return
   }

   defer file.Close()

   reader,err := gzip.NewReader(file)
   if err != nil {
      fmt.Printf("gzfile read faild,err: %v\n",err)
      return
   }
   // reader := bufio.NewReader(file)  读取出来的内容是二进制的

   var content []byte
   var buf [4096]byte
   for {
      n,err := reader.Read(buf[:])
      if err != nil && err != io.EOF {
         fmt.Printf("read %s faild,err: %v\n",filename,err)
         return
      }
      if n > 0 {
         validBuf := buf[0:n]
         content = append(content,validBuf...)
      }
      if err == io.EOF {
         break
      }
   }
   fmt.Printf("content,:%s\n",string(content))
}

写文件

func checkFileExists(filename string) bool {
   // 文件存在检测
   _,err := os.Stat(filename)
   if os.IsNotExist(err) {
      return false
   }
   return true
}

func createWriteFiles() {
   filename := "./bbb.txt"
   var file *os.File
   var err error

   // 文件追加或创建
   if checkFileExists(filename) {
      file,err = os.OpenFile(filename,os.O_APPEND|os.O_WRONLY,0755)
   }else {
      file,err = os.Create(filename)
   }
   if err != nil {
      fmt.Printf("create file %s,error :%v \n", filename, err)
      return
   }
   defer file.Close()
   //写入文件
   n,err := file.WriteString("hello world")
   if err != nil {
      fmt.Printf("write faild,err: %v\n",err)
      return
   }
   fmt.Printf("write %d succ\n",n)
}
  • 使用ioutil直接写入:可以覆盖文件
func ioutilWrite() {
   filename := "./bbb.txt"
   str := "ssssaddvfv"
   ioutil.WriteFile(filename,[]byte(str),0755)
}
  • 使用bufio写入文件: 可能会导致数据丢失
func checkFileExists(filename string) bool {
   // 文件存在检测
   _,err := os.Stat(filename)
   if os.IsNotExist(err) {
      return false
   }
   return true
}

func bufioWriteFile() {
   filename := "./ccc.txt"
   var file *os.File
   var err error
   if checkFileExists(filename) {
      file,err = os.OpenFile(filename,os.O_WRONLY|os.O_APPEND,0666)
   }else {
      file,err = os.Create(filename)
   }
   if err != nil {
      fmt.Printf("write file error:%v\n",err)
      return
   }

   defer file.Close()

   //bufio文件写入
   writer := bufio.NewWriter(file)
   writer.WriteString("helloworld,wxxx")
   writer.Flush()   //将缓存数据刷到文件
}
  • 拷贝文件
func copyFile(destFile,srcFile string) (written int64,err error) {
   src,err := os.Open(srcFile)
   if err != nil {
      fmt.Printf("open src file error:%v\n",err)
      return
   }
   defer src.Close()

   dst,err := os.OpenFile(destFile,os.O_WRONLY|os.O_APPEND,0666)
   if err != nil {
      return
   }
   return io.Copy(dst,src)
}

func main()  {
   copyFile("./ddd.txt","aaa.log")
}
  • 终端读写
func terminalControl() {
   writer := bufio.NewWriter(os.Stdout)
   writer.WriteString("hello")
   writer.Flush()

   //读取终端数据
   reader := bufio.NewReader(os.Stdin)
   data,err := reader.ReadString(‘\n‘)

   if err != nil {
      fmt.Printf("read fro  terminal error:%v\n",err)
   }

   fmt.Fprintf(os.Stdout,"data:%s\n",data)
}
  • 小练习:统计终端输入的字母数字空格的数量
func addWord(charCount map[rune]int,char rune){
   count,ok := charCount[char]
   if !ok {
      charCount[char] = 1
   }else {
      charCount[char] = count +1
   }
}

func main() {
   str := ""
   fmt.Scanln(&str)

   writer := bufio.NewWriter(os.Stdout)
   writer.WriteString("")
   writer.Flush()

   //读取终端数据
   reader := bufio.NewReader(os.Stdin)
   data,err := reader.ReadString(‘\n‘)

   if err != nil {
      fmt.Printf("read fro  terminal error:%v\n",err)
   }

   fmt.Fprintf(os.Stdout,"data:%s\n",data)
   var charCount map[rune]int = make(map[rune]int,10)
   var chars []rune = []rune(data)

   for i:=0;i<len(chars);i++ {
      addWord(charCount,chars[i])
   }

   for key,val := range charCount {
      fmt.Printf("keys:%c val: %d\n",key,val)
   }
}

命令行参数

func main() {
   //获取参数个数
   fmt.Printf("args count:%d\n",len(os.Args))
   //打印参数
   for index,v := range os.Args {
      fmt.Printf("args:%d,value:%s\n",index,v)
   }
}

flag包的使用

func flagArgs() {
   var num int
   var mode string

   flag.IntVar(&num,"num",16,"number of password")
   flag.StringVar(&mode,"mode","mix","mode of password generate")

   flag.Parse()

   fmt.Printf("num:%d,mode:%s\n",num,mode)
}

原文地址:https://blog.51cto.com/13812615/2485937

时间: 2024-11-09 02:16:50

Go语言入门(九) 文件操作的相关文章

Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

?? 上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存

C语言样式的文件操作函数

使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: 1 //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 2 FILE* fd = fopen(filename.c_str(), oflag); 2.写文件的函数原型: size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream ); 其中buffer是需要向文件中写入的内容在内存中的首地址指针,size是待写入

go语言系统-从文件操作到单元测试

目录 文件操作 输入流和输出流 打开文件和关闭文件 使用的函数和方法 案例演示 读文件操作应用案例 写文件操作应用案例 判断文件是否存在 文件编程应用实例 拷贝文件 统计英文.数字.空格和其它字符数量 命令行参数 举例说明 flag包用来解析命令行参数 Json Json基本介绍 应用场景 Json数据格式说明 Jsnon数据在线解析 Json的序列化 应用案例 Json的反序列化 应用案例 单元测试 先看一个需求 传统的方法 传统方法的缺点分析 单元测试 基本介绍 快速入门 单元测试快速入门总

C语言复习:文件操作

文件操作专题 C语言文件读写概念 文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁盘.磁带等) 设备文件:非存储介质(键盘.显示器.打印机等) 按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放 每个文件都以文件名为标识,I/O设备的文件名是系统定义的,如: COM1或AUX--第一串行口,附加设备

go语言之行--文件操作、命令行参数、序列化与反序列化详解

一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: 标准输入 os.Stdout: 标准输出 os.Stderr: 标准错误输出 读写示例: package main import ( "fmt" "os" ) var( username,password string ) func main() { fmt.Prin

小猿圈python入门之文件操作

学习知识要善于思考,思考,再思(考).我就是靠这个方法成为科学家的.——爱因斯坦 open() 方法 Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError. 注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法. open() 函数常用形式是接收两个参数:文件名(file)和模式(mode). 一般用法:open(file,mode="r") 完整的语法格式

Go语言基础之文件操作

本文主要介绍了Go语言中文件读写的相关操作. 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件. 打开和关闭文件 os.Open()函数能够打开一个文件,返回一个*File和一个err.对得到的文件实例调用close()方法能够关闭文件. package main import ( "fmt" "os" ) func main() { // 只读方式打开当前目录下的main.go文件 file, err := os

C语言中的文件操作---重定向操作文件

先说个题外话,文件操作以及字符串与字符深入处理(就是那些什么puts(), getchar()什么的)是本人深入认识C++最后的两座大山.而今天先把重定向文件操作解决掉. 输入输出重定向恐怕是文件I/O操作中最简单的方法了,具体用法是现在main函数的开头加入两条语句,例如: freopen("D:\\input.txt", "r", stdin); freopen("D:\\output.txt", "w", stdout)

git入门(3.文件操作)

三.GIT文件操作 版本控制就是对文件的版本控制,对于Linux来说,设备,目录等全是文件,要对文件进行修改.提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上. 文件状态 GIT仓库所在的目录称为工作目录,这个很好理解,我们的工程就在这里,工作时也是在这里做修改. 在工作目录中的文件被分为两种状态,一种是已跟踪状态(tracked),另一种是未跟踪状态(untracked).只有处于已跟踪状态的文件才被纳入GIT的版本控制.如下图: 当我们

Nginx基础入门之文件操作优化及请求特殊处理介绍

本节的内容主要讲到关于nginx文件操作优化以及对客户端请求特殊处理(比如限速,不合法请求处理,是否注明nginx版本号) 一.通过nginx对客户端相关请求做特殊处理 1.1 按HTTP方法名限制用户请求 语法:limit_except method ... {...} 配置块:location Nginx通过limit_except后面指定的方法名来限制用户请求.方法名可取值包括:GET.HEAD.POST.PUT.DELETE.MKCOL.COPY.MOVE.OPTIONS.PROPFIN